/ Hex Artifact Content
Login

Artifact 763cb50521ee88873522ae2e836b121f312d2bb2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 32 31 31 20 32 30 30 34 2f 30 36 2f 30 39 20 30  211 2004/06/09 0
0300: 39 3a 35 35 3a 31 37 20 64 61 6e 69 65 6c 6b 31  9:55:17 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 29 3b 0a 20 20 66 6f  Schema(db);.  fo
0f70: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
0f80: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
0f90: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
0fa0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
0fb0: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
0fc0: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
0fd0: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
0fe0: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
0ff0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
1000: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
1010: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
1020: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
1030: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
1040: 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73  b->aDb[j].tblHas
1050: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
1060: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
1070: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
1080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
1090: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
10a0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
10b0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
10c0: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
10d0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
10e0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
10f0: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20  name.** of that 
1100: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
1110: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
1120: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1130: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
1140: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1150: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1160: 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c 65 61 76  nd..** Also leav
1170: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1180: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
1190: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
11a0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
11b0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
11c0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
11d0: 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73 20 74 68  Table().** is th
11e0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
11f0: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
1200: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
1210: 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 77 68  e->zErrMsg.** wh
1220: 65 72 65 20 73 71 6c 69 74 65 33 46 69 6e 64 54  ere sqlite3FindT
1230: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
1240: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
1250: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61  e3LocateTable(Pa
1260: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1270: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1280: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
1290: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  se){.  Table *p;
12a0: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
12b0: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
12c0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
12d0: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
12e0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ){.    if( zDbas
12f0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1300: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1310: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1320: 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73  e: %s.%s", zDbas
1330: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
1340: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1350: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
1360: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  ->db, zName, 0)!
1370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1380: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1390: 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25 73 5c  se, "table \"%s\
13a0: 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61 74 61  " is not in data
13b0: 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  base \"%s\"",.  
13c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 44         zName, zD
13d0: 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  base);.    }else
13e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1400: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
1410: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
1420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1430: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1440: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1450: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1460: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1470: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1480: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1490: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
14a0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
14b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
14c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
14d0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
14e0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
14f0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1500: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1510: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1520: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1530: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1540: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1550: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1560: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1570: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
1580: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
1590: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
15a0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
15b0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
15c0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
15d0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
15e0: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
15f0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1600: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1610: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1620: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
1630: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1650: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1660: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1670: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
1680: 61 64 53 63 68 65 6d 61 28 64 62 29 3b 0a 20 20  adSchema(db);.  
1690: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
16a0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
16b0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
16c0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
16d0: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
16e0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
16f0: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1700: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
1710: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
1720: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
1730: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
1740: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
1750: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48  &db->aDb[j].idxH
1760: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
1770: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
1780: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
1790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
17a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
17b0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
17c0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
17d0: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
17e0: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
17f0: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
1800: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
1810: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1820: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
1830: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
1840: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
1850: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
1860: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
1870: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
1880: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
1890: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
18a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
18b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18c0: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
18d0: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
18e0: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
18f0: 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73  dex *pOld;..  as
1900: 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70  sert( db!=0 && p
1910: 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ->zName!=0 );.  
1920: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
1930: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
1940: 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  b[p->iDb].idxHas
1950: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  h, p->zName,.   
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d         strlen(p-
1980: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  >zName)+1, 0);. 
1990: 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20   if( pOld!=0 && 
19a0: 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73  pOld!=p ){.    s
19b0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
19c0: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
19d0: 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d  ].idxHash, pOld-
19e0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1a00: 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29  len(pOld->zName)
1a10: 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20  +1, pOld);.  }. 
1a20: 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41 66 66 20   if( p->zColAff 
1a30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1a40: 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  e(p->zColAff);. 
1a50: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
1a60: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  p);.}../*.** Unl
1a70: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ink the given in
1a80: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62  dex from its tab
1a90: 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a  le, then remove.
1aa0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ** the index fro
1ab0: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
1ac0: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
1ad0: 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74  its memory.** st
1ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1af0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
1b00: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
1b10: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
1b20: 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28 20  *pIndex){.  if( 
1b30: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1b40: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
1b50: 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54  {.    pIndex->pT
1b60: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
1b70: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
1b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
1b90: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1ba0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
1bb0: 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70  Index; p && p->p
1bc0: 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d  Next!=pIndex; p=
1bd0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
1be0: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
1bf0: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
1c00: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
1c10: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
1c20: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44   }.  }.  sqliteD
1c30: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
1c40: 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
1c50: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
1c60: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
1c70: 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
1c80: 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a   hash tables of.
1c90: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
1ca0: 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f  ection.  This ro
1cb0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1cc0: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
1cd0: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
1ce0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65  connection close
1cf0: 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63  s.  It is also c
1d00: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72  alled during a r
1d10: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68  ollback.** if th
1d20: 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20  ere were schema 
1d30: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
1d40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1d50: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20  **.** If iDb<=0 
1d60: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
1d70: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74  nternal schema t
1d80: 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61  ables for all da
1d90: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e  tabase.** files.
1da0: 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e    If iDb>=2 then
1db0: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
1dc0: 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f  nal schema for o
1dd0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c  nly the.** singl
1de0: 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64  e file indicated
1df0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e00: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
1e10: 68 65 6d 61 28 73 71 6c 69 74 65 20 2a 64 62 2c  hema(sqlite *db,
1e20: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73   int iDb){.  Has
1e30: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
1e40: 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61  Hash temp1;.  Ha
1e50: 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20  sh temp2;.  int 
1e60: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
1e70: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
1e80: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e  b->nDb );.  db->
1e90: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1ea0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20  _Initialized;.  
1eb0: 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d  for(i=iDb; i<db-
1ec0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1ed0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
1ee0: 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31  Db[i];.    temp1
1ef0: 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b   = pDb->tblHash;
1f00: 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62  .    temp2 = pDb
1f10: 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20  ->trigHash;.    
1f20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
1f30: 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20  &pDb->trigHash, 
1f40: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
1f50: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  NG, 0);.    sqli
1f60: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
1f70: 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73  b->aFKey);.    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 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
1fa0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
1fb0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
1fc0: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
1fd0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
1fe0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
1ff0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
2000: 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68  ger = sqliteHash
2010: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
2020: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
2030: 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72  Trigger(pTrigger
2040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2050: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74  ite3HashClear(&t
2060: 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  emp2);.    sqlit
2070: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
2080: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
2090: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
20a0: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
20b0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
20c0: 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20  &temp1); pElem; 
20d0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
20e0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
20f0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2100: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
2110: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73  (pElem);.      s
2120: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
2130: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
2140: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61   }.    sqlite3Ha
2150: 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b  shClear(&temp1);
2160: 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70  .    DbClearProp
2170: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53  erty(db, i, DB_S
2180: 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20  chemaLoaded);.  
2190: 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65    if( iDb>0 ) re
21a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
21b0: 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20  rt( iDb==0 );.  
21c0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
21d0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
21e0: 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  es;..  /* If one
21f0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
2200: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2210: 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65  se files has bee
2220: 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74  n closed,.  ** t
2230: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20  hen remove then 
2240: 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61  from the auxilia
2250: 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74  ry database list
2260: 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20  .  We take the. 
2270: 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   ** opportunity 
2280: 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20  to do this here 
2290: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75  since we have ju
22a0: 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f  st deleted all o
22b0: 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d  f the.  ** schem
22c0: 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  a hash tables an
22d0: 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e  d therefore do n
22e0: 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  ot have to make 
22f0: 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  any changes.  **
2300: 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   to any of those
2310: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2320: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
2330: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
2340: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
2350: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2360: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
2370: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
2380: 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78  ->pAux && pDb->x
2390: 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78  FreeAux ) pDb->x
23a0: 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75  FreeAux(pDb->pAu
23b0: 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  x);.      pDb->p
23c0: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
23d0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20   }.  for(i=j=2; 
23e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
23f0: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
2400: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
2410: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
2420: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
2430: 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e  sqliteFree(pDb->
2440: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44  zName);.      pD
2450: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
2460: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2470: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
2480: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
2490: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
24a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
24b0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64  .  }.  memset(&d
24c0: 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64  b->aDb[j], 0, (d
24d0: 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66  b->nDb-j)*sizeof
24e0: 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20  (db->aDb[j]));. 
24f0: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
2500: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
2510: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
2520: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
2530: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
2540: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
2550: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
2560: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
2570: 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20  Free(db->aDb);. 
2580: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
2590: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
25a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
25b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
25c0: 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
25d0: 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20  ack occurs.  If 
25e0: 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63  there were.** sc
25f0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
2600: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
2610: 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76  ion, then we hav
2620: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  e to reset the.*
2630: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
2640: 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61  tables and reloa
2650: 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b  d them from disk
2660: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2670: 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  3RollbackInterna
2680: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2690: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
26a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
26b0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
26c0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
26d0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
26e0: 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, 0);.  }.}../*
26f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2700: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2710: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
2720: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2730: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
2740: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
2750: 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ){.  db->aDb[0].
2760: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20  schema_cookie = 
2770: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b  db->next_cookie;
2780: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
2790: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
27a0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
27b0: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
27c0: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
27d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
27e0: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
27f0: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
2800: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
2810: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
2820: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
2830: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
2840: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
2850: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
2860: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
2870: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
2880: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
2890: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
28a0: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
28b0: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
28c0: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
28d0: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
28e0: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
28f0: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
2900: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
2910: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
2920: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
2930: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
2940: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2950: 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * Indices associ
2960: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
2970: 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64  ble are unlinked
2980: 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a   from the "db".*
2990: 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  * data structure
29a0: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49   if db!=NULL.  I
29b0: 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69  f db==NULL, indi
29c0: 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a  ces attached to.
29d0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  ** the table are
29e0: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74   deleted, but it
29f0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79   is assumed they
2a00: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
2a10: 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a  en.** unlinked..
2a20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
2a30: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
2a40: 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  e *db, Table *pT
2a50: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
2a60: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
2a70: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
2a80: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
2a90: 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  ey;..  if( pTabl
2aa0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
2ab0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
2ac0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
2ad0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
2ae0: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
2af0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
2b00: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
2b10: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
2b20: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
2b30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
2b40: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62  ert( pIndex->iDb
2b50: 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c  ==pTable->iDb ||
2b60: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30   (pTable->iDb==0
2b70: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d   && pIndex->iDb=
2b80: 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  =1) );.    sqlit
2b90: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
2ba0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
2bb0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
2bc0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
2bd0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
2be0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
2bf0: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
2c00: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2c10: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2c20: 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68  e db->aFKey hash
2c30: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66   table .  */.  f
2c40: 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d  or(pFKey=pTable-
2c50: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
2c60: 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b  FKey=pNextFKey){
2c70: 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d  .    pNextFKey =
2c80: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
2c90: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
2ca0: 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e  Table->iDb<db->n
2cb0: 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
2cc0: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
2cd0: 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c  d(&db->aDb[pTabl
2ce0: 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20  e->iDb].aFKey,. 
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
2d10: 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b  >zTo, strlen(pFK
2d20: 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b  ey->zTo)+1)!=pFK
2d30: 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
2d40: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d  Free(pFKey);.  }
2d50: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
2d60: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2d70: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
2d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2d90: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
2da0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2db0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
2dc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
2dd0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2de0: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20  ol[i].zDflt);.  
2df0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2e00: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  ble->aCol[i].zTy
2e10: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
2e20: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  eFree(pTable->zN
2e30: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
2e40: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  ee(pTable->aCol)
2e50: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  ;.  if( pTable->
2e60: 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 73  zColAff ){.    s
2e70: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2e80: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a  ->zColAff);.  }.
2e90: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2ea0: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
2eb0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2ec0: 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a  Free(pTable);.}.
2ed0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
2ee0: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
2ef0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
2f00: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
2f10: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
2f20: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
2f30: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
2f40: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
2f50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2f60: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
2f70: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
2f80: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
2f90: 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a  .  Table *pOld;.
2fa0: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
2fb0: 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  2;.  int i = p->
2fc0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  iDb;.  assert( d
2fd0: 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d  b!=0 );.  pOld =
2fe0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2ff0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74  rt(&db->aDb[i].t
3000: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
3010: 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d  , strlen(p->zNam
3020: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  e)+1, 0);.  asse
3030: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
3040: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28  Old==p );.  for(
3050: 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  pF1=p->pFKey; pF
3060: 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78  1; pF1=pF1->pNex
3070: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20  tFrom){.    int 
3080: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
3090: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
30a0: 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73  pF2 = sqlite3Has
30b0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69  hFind(&db->aDb[i
30c0: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
30d0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28  o, nTo);.    if(
30e0: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
30f0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3100: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d  sert(&db->aDb[i]
3110: 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  .aFKey, pF1->zTo
3120: 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78  , nTo, pF1->pNex
3130: 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tTo);.    }else{
3140: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46  .      while( pF
3150: 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54  2 && pF2->pNextT
3160: 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46  o!=pF1 ){ pF2=pF
3170: 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20  2->pNextTo; }.  
3180: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
3190: 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78         pF2->pNex
31a0: 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74  tTo = pF1->pNext
31b0: 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  To;.      }.    
31c0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
31d0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
31e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  );.}../*.** Cons
31f0: 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f  truct the name o
3200: 66 20 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f  f a user table o
3210: 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74  r index from a t
3220: 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  oken..**.** Spac
3230: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  e to hold the na
3240: 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  me is obtained f
3250: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3260: 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62  () and must.** b
3270: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3280: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
3290: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
32a0: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
32b0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ken(Token *pName
32c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
32d0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
32e0: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
32f0: 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->n);.  sqlite3D
3300: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3310: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
3320: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
3330: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
3340: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
3350: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
3360: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
3370: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
3380: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
3390: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
33a0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
33b0: 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69  Table(Vdbe *v, i
33c0: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
33d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
33e0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
33f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
3400: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
3410: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
3420: 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74  R_ROOT);.  sqlit
3430: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3440: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
3450: 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74   0, 5); /* sqlit
3460: 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63  e_master has 5 c
3470: 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  olumns */.}../*.
3480: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
3490: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
34a0: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
34b0: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
34c0: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
34d0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
34e0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
34f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3500: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
3510: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
3520: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
3530: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
3540: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
3550: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
3560: 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73 71  */.int findDb(sq
3570: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
3580: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
3590: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
35a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
35b0: 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e 3d     if( pName->n=
35c0: 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61 44 62 5b  =strlen(db->aDb[
35d0: 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  i].zName) && .  
35e0: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
35f0: 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e 61 44 62  StrNICmp(db->aDb
3600: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [i].zName, pName
3610: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29  ->z, pName->n) )
3620: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  {.      return i
3630: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3640: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69 6e 74 20  turn -1;.}..int 
3650: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
3660: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
3670: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
3680: 4e 61 6d 65 31 2c 20 0a 20 20 54 6f 6b 65 6e 20  Name1, .  Token 
3690: 2a 70 4e 61 6d 65 32 2c 20 0a 20 20 54 6f 6b 65  *pName2, .  Toke
36a0: 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a 29 7b 0a 20  n **pUnqual.){. 
36b0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
36c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
36d0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61  ->db;..  if( pNa
36e0: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
36f0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
3700: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
3710: 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c   );.    *pUnqual
3720: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
3730: 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c 20  Db = findDb(db, 
3740: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
3750: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
3760: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3770: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
3780: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
3790: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
37a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
37b0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
37c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
37d0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
37e0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
37f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
3800: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
3810: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
3820: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
3830: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
3840: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
3850: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
3860: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
3870: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
3880: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
3890: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
38a0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
38b0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
38c0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
38d0: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
38e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
38f0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
3900: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3910: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
3920: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
3930: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
3940: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
3950: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
3960: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
3970: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
3980: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
3990: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
39a0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
39b0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
39c0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
39d0: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
39e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
39f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
3a00: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
3a10: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
3a20: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
3a30: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
3a40: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
3a50: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
3a60: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
3a70: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
3a80: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
3a90: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
3aa0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
3ab0: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
3ac0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
3ad0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
3ae0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3af0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
3b00: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
3b10: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
3b20: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
3b30: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
3b40: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
3b50: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
3b60: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
3b70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
3b80: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
3b90: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
3ba0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
3bb0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
3bc0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
3bd0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
3be0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3bf0: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
3c00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3c10: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3c20: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  t */.  Token *pS
3c30: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22  tart,   /* The "
3c40: 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f  CREATE" token */
3c50: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
3c60: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
3c70: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
3c80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
3c90: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
3ca0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
3cb0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
3cc0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3cd0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
3ce0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
3cf0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
3d00: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
3d10: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20 20  /.  int isView  
3d20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3d30: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
3d40: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3d50: 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70  able;.  Index *p
3d60: 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  Idx;.  char *zNa
3d70: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  me;.  sqlite *db
3d80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
3d90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
3da0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
3db0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
3dc0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
3dd0: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
3de0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
3df0: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
3e00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
3e10: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
3e20: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
3e30: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
3e40: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
3e50: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
3e60: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
3e70: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
3e80: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
3e90: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
3ea0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
3eb0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
3ec0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
3ed0: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
3ee0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
3ef0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
3f00: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
3f10: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
3f20: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
3f30: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
3f40: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
3f50: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
3f60: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
3f70: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
3f80: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
3f90: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
3fa0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
3fb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
3fc0: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
3fd0: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
3fe0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
3ff0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4000: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
4010: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
4020: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4030: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
4040: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
4050: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
4060: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
4070: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
4080: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
4090: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
40a0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
40b0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
40c0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
40d0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
40e0: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
40f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4100: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
4110: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
4120: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
4130: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
4140: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
4150: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
4160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4170: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
4180: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
4190: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
41a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
41b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
41c0: 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
41d0: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
41e0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
41f0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
4200: 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  e = sqlite3Table
4210: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
4220: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
4230: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
4240: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
4250: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
4260: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
4270: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
4280: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
4290: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
42a0: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
42b0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
42c0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
42d0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
42e0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
42f0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
4300: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
4310: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
4320: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
4330: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4340: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
4350: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
4360: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
4370: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
4380: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
4390: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
43a0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
43b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
43c0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
43d0: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
43e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
43f0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
4400: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
4410: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
4420: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
4430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
4440: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4450: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
4460: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4470: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
4480: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
4490: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
44a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
44b0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
44c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
44d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
44e0: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20  efore trying to 
44f0: 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  create a tempora
4500: 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73  ry table, make s
4510: 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f  ure the Btree fo
4520: 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74  r.  ** holding t
4530: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
4540: 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  is open..  */.  
4550: 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62  if( isTemp && db
4560: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
4570: 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
4580: 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
4590: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
45a0: 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
45b0: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
45c0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
45d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
45e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
45f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4600: 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
4610: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
4620: 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
4630: 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
4640: 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
4650: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
4660: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4670: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4680: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
4690: 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
46a0: 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
46b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
46c0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
46d0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 2c  ->aDb[1].pBt, 1,
46e0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
46f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4720: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
4730: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
4740: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
4750: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
4760: 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
4770: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
4780: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
4790: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
47a0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
47b0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
47c0: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
47d0: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
47e0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
47f0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
4800: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
4810: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
4820: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
4830: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
4840: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
4850: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
4860: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b].zName);.  if(
4870: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73   pTable ){.    s
4880: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4890: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
48a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
48b0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  , pName);.    sq
48c0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
48d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
48e0: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
48f0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
4900: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
4910: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28  0 &&.          (
4920: 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20  pIdx->iDb==0 || 
4930: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
4940: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4950: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4960: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
4970: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
4980: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
4990: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
49a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
49b0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
49c0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
49d0: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
49e0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
49f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4a00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
4a10: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
4a20: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
4a30: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
4a40: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
4a50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
4a60: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
4a70: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
4a80: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
4a90: 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20  Db = iDb;.  if( 
4aa0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4ab0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
4ac0: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
4ad0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
4ae0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4af0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
4b00: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
4b10: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
4b20: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
4b30: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
4b40: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
4b50: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
4b60: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
4b70: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
4b80: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
4b90: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
4ba0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
4bb0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
4bc0: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
4bd0: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
4be0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
4bf0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
4c00: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
4c10: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
4c20: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
4c30: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
4c40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
4c50: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
4c60: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
4c70: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
4c80: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
4c90: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
4ca0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
4cb0: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
4cc0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
4cd0: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
4ce0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
4cf0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4d00: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
4d10: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
4d20: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
4d30: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
4d40: 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61   /* Every time a
4d50: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63 72   new table is cr
4d60: 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66  eated the file-f
4d70: 6f 72 6d 61 74 0a 20 20 20 20 20 20 2a 2a 20 61  ormat.      ** a
4d80: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61  nd encoding meta
4d90: 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65 74 20  -values are set 
4da0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
4db0: 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 63 61 73   in.      ** cas
4dc0: 65 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  e this is the fi
4dd0: 72 73 74 20 74 61 62 6c 65 20 63 72 65 61 74 65  rst table create
4de0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
4df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e00: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4e10: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
4e20: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
4e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4e40: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
4e50: 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Db, 1);.      sq
4e60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4e70: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
4e80: 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  ->enc, 0);.     
4e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ea0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
4eb0: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
4ec0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
4ed0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
4ee0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
4ef0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4f00: 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
4f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
4f30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
4f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4f50: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
4f60: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
4f70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4f80: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
4f90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
4fa0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
4fb0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
4fc0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
4fd0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
4fe0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
4ff0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
5000: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
5010: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
5020: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
5030: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
5040: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5050: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
5060: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
5070: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
5080: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5090: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
50a0: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
50b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
50c0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
50d0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
50e0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
50f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
5100: 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d   *z = 0;.  Colum
5110: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
5120: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
5130: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
5140: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74  rn;.  sqlite3Set
5150: 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d  NString(&z, pNam
5160: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
5170: 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0);.  if( z==0 )
5180: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
5190: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
51a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
51b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
51c0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
51d0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
51e0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
51f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5200: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
5210: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
5220: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
5230: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
5240: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5250: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
5260: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
5270: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
5280: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
5290: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
52a0: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
52b0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
52c0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
52d0: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
52e0: 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  rn;.    p->aCol 
52f0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
5300: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
5310: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
5320: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
5330: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
5340: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
5350: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
5360: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
5370: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
5380: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
5390: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
53a0: 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20  NONE'. If there 
53b0: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
53c0: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
53d0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
53e0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
53f0: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
5400: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
5410: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
5420: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
5430: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
5440: 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c  NE;.  pCol->pCol
5450: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
5460: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e  pDfltColl;.  p->
5470: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
5480: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5490: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
54a0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
54b0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
54c0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
54d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
54e0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
54f0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
5500: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
5510: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
5520: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
5530: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
5540: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
5550: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5560: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5570: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
5580: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
5590: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
55a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
55b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70   int i;.  if( (p
55c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
55d0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
55e0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
55f0: 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  -1;.  if( i>=0 )
5600: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e   p->aCol[i].notN
5610: 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d  ull = onError;.}
5620: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5630: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
5640: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
5650: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
5660: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
5670: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5680: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
5690: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
56a0: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
56b0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
56c0: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
56d0: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
56e0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
56f0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
5700: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
5710: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
5720: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
5730: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
5740: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
5750: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
5760: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
5770: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
5780: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
5790: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
57a0: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
57b0: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
57c0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
57d0: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
57e0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46  Parse, Token *pF
57f0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61  irst, Token *pLa
5800: 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  st){.  Table *p;
5810: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
5820: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c  nt n;.  char *z,
5830: 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   **pz;.  Column 
5840: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
5850: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5860: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
5870: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
5880: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
5890: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
58a0: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70  &p->aCol[i];.  p
58b0: 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65  z = &pCol->zType
58c0: 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e  ;.  n = pLast->n
58d0: 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a   + Addr(pLast->z
58e0: 29 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d  ) - Addr(pFirst-
58f0: 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  >z);.  sqlite3Se
5900: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69  tNString(pz, pFi
5910: 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20  rst->z, n, 0);. 
5920: 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20   z = *pz;.  if( 
5930: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
5940: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d   for(i=j=0; z[i]
5950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
5960: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66  c = z[i];.    if
5970: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
5980: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
5990: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
59a0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d  [j] = 0;.  pCol-
59b0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
59c0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
59d0: 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z, n);.}../*.** 
59e0: 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20  The given token 
59f0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
5a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73  alue for the las
5a10: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
5a20: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63  o.** the table c
5a30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
5a40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  onstruction.  If
5a50: 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20   "minusFlag" is 
5a60: 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  true, it.** mean
5a70: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65  s the value toke
5a80: 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  n was preceded b
5a90: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
5aa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5ab0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
5ac0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
5ad0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
5ae0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
5af0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5b00: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
5b10: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
5b20: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
5b30: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c  rse, Token *pVal
5b40: 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29  , int minusFlag)
5b50: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5b60: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a  int i;.  char **
5b70: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
5b80: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5b90: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
5ba0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
5bb0: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
5bc0: 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61  rn;.  pz = &p->a
5bd0: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20  Col[i].zDflt;.  
5be0: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
5bf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
5c00: 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20  String(pz, "-", 
5c10: 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  1, pVal->z, pVal
5c20: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
5c30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
5c40: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c  NString(pz, pVal
5c50: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
5c60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
5c70: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
5c80: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
5c90: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5ca0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
5cb0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
5cc0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
5cd0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
5ce0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
5cf0: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
5d00: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
5d10: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
5d20: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
5d30: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
5d40: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
5d50: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
5d60: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
5d70: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
5d80: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
5d90: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
5da0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
5db0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
5dc0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
5dd0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
5de0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
5df0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5e00: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
5e10: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
5e20: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
5e30: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
5e40: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
5e50: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
5e60: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
5e70: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
5e80: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
5e90: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
5ea0: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
5eb0: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
5ec0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
5ed0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
5ee0: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
5ef0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
5f00: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
5f10: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
5f20: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
5f30: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
5f40: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
5f50: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
5f60: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
5f70: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
5f80: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
5f90: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5fa0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
5fb0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
5fc0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5fd0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
5fe0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
5ff0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
6000: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
6010: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
6020: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
6030: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
6040: 72 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20  rimaryKey(Parse 
6050: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
6060: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e  t *pList, int on
6070: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
6080: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
6090: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
60a0: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
60b0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
60c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
60d0: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
60e0: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
60f0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
6100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
6110: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
6120: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
6130: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
6140: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
6150: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
6160: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
6170: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
6180: 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  .  pTab->hasPrim
6190: 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Key = 1;.  if( p
61a0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
61b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
61c0: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
61d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
61e0: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mKey = 1;.  }els
61f0: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
6200: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
6210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
6220: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
6230: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
6240: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
6250: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
6260: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
6270: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
6280: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6290: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
62a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
62b0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
62c0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61  pTab->nCol ) pTa
62d0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
62e0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
62f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
6300: 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c  ->nExpr>1 ) iCol
6310: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
6320: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
6330: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
6340: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
6350: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
6360: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79  e;.  }.  if( zTy
6370: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
6380: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
6390: 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20  EGER")==0 ){.   
63a0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
63b0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
63c0: 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72  eyConf = onError
63d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
63e0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
63f0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
6400: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
6410: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c  r, 0, 0);.    pL
6420: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
6430: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
6440: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6450: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
6460: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
6470: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
6480: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
6490: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
64a0: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
64b0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
64c0: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
64d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
64e0: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
64f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
6500: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
6510: 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61  int nType){.  Ta
6520: 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20  ble *p;.  Index 
6530: 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pIdx;.  CollSeq
6540: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
6550: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
6560: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6570: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6580: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a  i = p->nCol-1;..
6590: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
65a0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
65b0: 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54  Parse, zType, nT
65c0: 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b  ype);.  p->aCol[
65d0: 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  i].pColl = pColl
65e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
65f0: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
6600: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
6610: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
6620: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74   <type>",.  ** t
6630: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
6640: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
6650: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
6660: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a  n before the.  *
6670: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
6680: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
6690: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
66a0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f  s the case..  */
66b0: 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d  .  for(pIdx = p-
66c0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
66d0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
66e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
66f0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  dx->nColumn==1 )
6700: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
6710: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
6720: 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
6730: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[0] = pColl;
6740: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
6750: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
6760: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6770: 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61  e db.aCollSeq ha
6780: 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
6790: 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66   entry.** specif
67a0: 69 65 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64  ied by zName and
67b0: 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f   nName is not fo
67c0: 75 6e 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65  und and paramete
67d0: 72 20 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a  r 'create' is.**
67e0: 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61   true, then crea
67f0: 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 0a  te a new entry..
6800: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 46 6f  **.** FIX ME: Fo
6810: 72 20 6e 6f 77 2c 20 72 65 74 75 72 6e 20 4e 55  r now, return NU
6820: 4c 4c 20 69 66 20 63 72 65 61 74 65 20 69 73 20  LL if create is 
6830: 6e 6f 74 20 74 72 75 65 20 61 6e 64 20 74 68 65  not true and the
6840: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   entry is not.**
6850: 20 66 6f 75 6e 64 2e 20 42 75 74 20 74 68 69 73   found. But this
6860: 20 6e 65 65 64 73 20 74 6f 20 63 68 61 6e 67 65   needs to change
6870: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 63 6f 6c   to call the col
6880: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 2e 0a  lation factory..
6890: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 49 66  **.** FIX ME: If
68a0: 20 77 65 20 68 61 76 65 20 61 20 55 54 46 2d 38   we have a UTF-8
68b0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
68c0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
68d0: 6f 6e 2c 20 61 6e 64 20 61 0a 2a 2a 20 55 54 46  on, and a.** UTF
68e0: 2d 31 36 20 76 65 72 73 69 6f 6e 20 77 6f 75 6c  -16 version woul
68f0: 64 20 62 65 20 62 65 74 74 65 72 2c 20 73 68 6f  d be better, sho
6900: 75 6c 64 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  uld the collatio
6910: 6e 20 66 61 63 74 6f 72 79 20 62 65 20 63 61 6c  n factory be cal
6920: 6c 65 64 3f 0a 2a 2a 20 49 66 20 73 6f 20 73 68  led?.** If so sh
6930: 6f 75 6c 64 20 61 20 66 6c 61 67 20 62 65 20 73  ould a flag be s
6940: 65 74 20 74 6f 20 73 61 79 20 74 68 61 74 20 77  et to say that w
6950: 65 20 61 6c 72 65 61 64 79 20 72 65 71 75 65 73  e already reques
6960: 74 65 64 20 73 75 63 68 20 61 0a 2a 2a 20 66 75  ted such a.** fu
6970: 6e 63 74 69 6f 6e 20 61 6e 64 20 63 6f 75 6c 64  nction and could
6980: 6e 27 74 20 67 65 74 20 6f 6e 65 3f 0a 2a 2f 0a  n't get one?.*/.
6990: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
69a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20 73  FindCollSeq(.  s
69b0: 71 6c 69 74 65 20 2a 64 62 2c 20 0a 20 20 63 6f  qlite *db, .  co
69c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
69d0: 20 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20   .  int nName,. 
69e0: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
69f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6a00: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
6a10: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
6a20: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
6a30: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
6a40: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
6a50: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
6a60: 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26    if( 0==pColl &
6a70: 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20 20  & create ){.    
6a80: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pColl = sqliteMa
6a90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
6aa0: 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  oll) + nName + 1
6ab0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
6ac0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  l ){.      pColl
6ad0: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
6ae0: 29 26 70 43 6f 6c 6c 5b 31 5d 3b 0a 20 20 20 20  )&pColl[1];.    
6af0: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2d 3e    memcpy(pColl->
6b00: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
6b10: 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  ame+1);.      sq
6b20: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
6b30: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70  &db->aCollSeq, p
6b40: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61  Coll->zName, nNa
6b50: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  me, pColl);.    
6b60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
6b70: 43 6f 6c 6c 3b 0a 7d 0a 0a 43 6f 6c 6c 53 65 71  Coll;.}..CollSeq
6b80: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
6b90: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
6ba0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
6bb0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
6bc0: 6d 65 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  me){.  CollSeq *
6bd0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
6be0: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
6bf0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  e->db, zName, nN
6c00: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  ame, 0);.  if( !
6c10: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  pColl ){.    if(
6c20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
6c30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6c40: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  3SetNString(&pPa
6c50: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20  rse->zErrMsg, . 
6c60: 20 20 20 20 20 20 20 20 20 22 6e 6f 20 73 75 63           "no suc
6c70: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
6c80: 65 6e 63 65 3a 20 22 2c 20 2d 31 2c 20 0a 20 20  ence: ", -1, .  
6c90: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 6e          zName, n
6ca0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
6cb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6cc0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
6cd0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   pColl;.}..../*.
6ce0: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
6cf0: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
6d00: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
6d10: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
6d20: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
6d30: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f  ffinity type..*/
6d40: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
6d50: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
6d60: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
6d70: 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e   nType){.  int n
6d80: 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a  , i;.  struct {.
6d90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6da0: 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72  zSub;  /* Keywor
6db0: 64 73 20 73 75 62 73 74 72 69 6e 67 20 74 6f 20  ds substring to 
6dc0: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
6dd0: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
6de0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
6df0: 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63 68  f zSub */.    ch
6e00: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
6e10: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20   /* Affinity to 
6e20: 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d 61 74  return if it mat
6e30: 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73  ches */.  } subs
6e40: 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20  trings[] = {.   
6e50: 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c   {"INT",  3, SQL
6e60: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d  ITE_AFF_INTEGER}
6e70: 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c 20 34  ,.    {"CHAR", 4
6e80: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  , SQLITE_AFF_TEX
6e90: 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c  T},.    {"CLOB",
6ea0: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
6eb0: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54  EXT},.    {"TEXT
6ec0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
6ed0: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c  _TEXT},.    {"BL
6ee0: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
6ef0: 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a  FF_NONE},.  };..
6f00: 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30 20 29    if( nType==0 )
6f10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6f20: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6f30: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
6f40: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
6f50: 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69  )/sizeof(substri
6f60: 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ngs[0]); i++){. 
6f70: 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75 62 73     int c1 = subs
6f80: 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30  trings[i].zSub[0
6f90: 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20  ];.    int c2 = 
6fa0: 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20 20  tolower(c1);.   
6fb0: 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79   int limit = nTy
6fc0: 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67 73 5b  pe - substrings[
6fd0: 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e  i].nSub;.    con
6fe0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 75 62  st char *z = sub
6ff0: 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b  strings[i].zSub;
7000: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
7010: 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20  =limit; n++){.  
7020: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54 79 70      int c = zTyp
7030: 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[n];.      if( 
7040: 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29  (c==c1 || c==c2)
7050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
7060: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
7070: 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a  Cmp(&zType[n], z
7080: 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  , substrings[i].
7090: 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 20  nSub) ){.       
70a0: 20 72 65 74 75 72 6e 20 73 75 62 73 74 72 69 6e   return substrin
70b0: 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  gs[i].affinity;.
70c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
70d0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
70e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d  E_AFF_NUMERIC;.}
70f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
7100: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
7110: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
7120: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
7130: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
7140: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
7150: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
7160: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
7170: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
7180: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
7190: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
71a0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
71b0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
71c0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
71d0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
71e0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
71f0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
7200: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
7210: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
7220: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
7230: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
7240: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
7250: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
7260: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
7270: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
7280: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
7290: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
72a0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
72b0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
72c0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
72d0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
72e0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
72f0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
7300: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
7310: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
7320: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
7330: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
7340: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
7350: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
7360: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
7370: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
7380: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
7390: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
73a0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
73b0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
73c0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
73d0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
73e0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
73f0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
7400: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
7410: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  okie(sqlite *db,
7420: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
7430: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  b){.  unsigned c
7440: 68 61 72 20 72 3b 0a 20 20 69 6e 74 20 2a 70 53  har r;.  int *pS
7450: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 26 28  chemaCookie = &(
7460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
7470: 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20 20  ema_cookie);..  
7480: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
7490: 73 28 31 2c 20 26 72 29 3b 0a 20 20 2a 70 53 63  s(1, &r);.  *pSc
74a0: 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a 70 53  hemaCookie = *pS
74b0: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 2b 20 72 20  chemaCookie + r 
74c0: 2b 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  + 1;.  db->flags
74d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
74e0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
74f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
7500: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2a 70 53 63  OP_Integer, *pSc
7510: 68 65 6d 61 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a  hemaCookie, 0);.
7520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7530: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
7540: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
7550: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
7560: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
7570: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
7580: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
7590: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
75a0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
75b0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
75c0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
75d0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
75e0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
75f0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73  terminator..*/.s
7600: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
7610: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
7620: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
7630: 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d   int needQuote =
7640: 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   0;.  for(n=0; *
7650: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
7660: 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29    if( *z=='\'' )
7670: 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65  { n++; needQuote
7680: 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  =1; }.  }.  retu
7690: 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65  rn n + needQuote
76a0: 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  *2;.}../*.** Wri
76b0: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
76c0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
76d0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
76e0: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
76f0: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
7700: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
7710: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
7720: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
7730: 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29  x, char *zIdent)
7740: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  {.  int i, j, ne
7750: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
7760: 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  pIdx;.  for(j=0;
7770: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
7780: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
7790: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
77a0: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
77b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
77c0: 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65  eedQuote =  zIde
77d0: 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69  nt[j]!=0 || isdi
77e0: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
7810: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
7820: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
7830: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
7840: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72  +] = '\'';.  for
7850: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
7860: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
7870: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
7880: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
7890: 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20  =='\'' ) z[i++] 
78a0: 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66  = '\'';.  }.  if
78b0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
78c0: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a  i++] = '\'';.  z
78d0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
78e0: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
78f0: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
7900: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7910: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
7920: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
7930: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
7940: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
7950: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
7960: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
7970: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
7980: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
7990: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
79a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
79b0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
79c0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62  ateTableStmt(Tab
79d0: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
79e0: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
79f0: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
7a00: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
7a10: 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  d;.  n = 0;.  fo
7a20: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
7a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  ; i++){.    n +=
7a40: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
7a50: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
7a60: 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b      if( p->aCol[
7a70: 69 5d 2e 7a 54 79 70 65 20 29 7b 0a 20 20 20 20  i].zType ){.    
7a80: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 70    n += (strlen(p
7a90: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
7aa0: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
7ab0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
7ac0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
7ad0: 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20   if( n<40 ){.   
7ae0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
7af0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
7b00: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
7b10: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
7b20: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
7b30: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
7b40: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
7b50: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
7b60: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
7b70: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
7b80: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
7b90: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
7ba0: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
7bb0: 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20  Stmt, p->iDb==1 
7bc0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
7bd0: 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45  ABLE " : "CREATE
7be0: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
7bf0: 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a   strlen(zStmt);.
7c00: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
7c10: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
7c20: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
7c30: 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '(';.  for(i=0; 
7c40: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
7c50: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
7c60: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
7c70: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
7c80: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
7c90: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
7ca0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
7cb0: 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &k, p->aCol[i].z
7cc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
7cd0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
7ce0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b  ){.      zStmt[k
7cf0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
7d00: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
7d10: 5d 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  ], p->aCol[i].zT
7d20: 79 70 65 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d  ype);.      k +=
7d30: 20 73 74 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b   strlen(p->aCol[
7d40: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d  i].zType);.    }
7d50: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
7d60: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
7d70: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
7d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7d90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7da0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
7db0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
7dc0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
7dd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7de0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
7df0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
7e00: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
7e10: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
7e20: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
7e30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
7e40: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
7e50: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
7e60: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
7e70: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
7e80: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
7e90: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
7ea0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
7eb0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
7ec0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
7ed0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7ee0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
7ef0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
7f00: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
7f10: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
7f20: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
7f30: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
7f40: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
7f50: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
7f60: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
7f70: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
7f80: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
7f90: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
7fa0: 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20  changes, so the 
7fb0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
7fc0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
7fd0: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
7fe0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
7ff0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
8000: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
8010: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
8020: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
8030: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
8040: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
8050: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
8060: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
8070: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
8080: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
8090: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
80a0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
80b0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
80c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
80d0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
80e0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
80f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
8100: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
8110: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
8120: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
8130: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  se, Token *pEnd,
8140: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
8150: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8160: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
8170: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
8180: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
8190: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
81a0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
81b0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
81c0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
81d0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
81e0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
81f0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
8200: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
8210: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
8220: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
8230: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
8240: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
8250: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
8260: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
8270: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
8280: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
8290: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
82a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 7d 0a 0a  pSelect ){.  }..
82b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
82c0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
82d0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
82e0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
82f0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
8300: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
8310: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
8320: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
8330: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
8340: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
8350: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
8360: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
8380: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
8390: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
83a0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
83b0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
83c0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
83d0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
83e0: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
83f0: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
8400: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
8410: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
8420: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
8430: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
8440: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
8450: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
8460: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
8470: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
8480: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
8490: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
84a0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
84b0: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
84c0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
84d0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
84e0: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
84f0: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
8500: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
8510: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
8520: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
8530: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
8540: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
8550: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
8560: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
8570: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
8580: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
8590: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
85a0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
85b0: 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73  e *v;..    v = s
85c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
85d0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
85e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
85f0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
8600: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
8610: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
8620: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8630: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
8640: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
8650: 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29 26 70  ->iDb, (char*)&p
8660: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
8670: 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER);.    }else{.
8680: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
8690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
86a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
86b0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
86c0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
86d0: 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 73 71 6c 69  m = 0;..    sqli
86e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
86f0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
8700: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
8710: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
8720: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
8730: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
8740: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
8750: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
8760: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
8770: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
8780: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
8790: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
87a0: 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  e is on the top 
87b0: 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63  of the vdbe stac
87c0: 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  k..    **.    **
87d0: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
87e0: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
87f0: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
8800: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
8810: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
8820: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
8830: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
8840: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
8850: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
8860: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
8870: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8880: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
8890: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
88a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
88b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
88c0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
88d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
88e0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
88f0: 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  p->iDb, 0);.    
8900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8910: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
8920: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
8930: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
8940: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
8950: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
8960: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
8970: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  e, 1, 0, 0, 0, 0
8980: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
89a0: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
89b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
89c0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
89d0: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
89e0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
89f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
8a00: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
8a10: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
8a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
8a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
8a40: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
8a50: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
8a60: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
8a70: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
8a80: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
8a90: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
8aa0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
8ab0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
8ac0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8ad0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
8ae0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
8af0: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 73  }.    }.  .    s
8b00: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
8b10: 54 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29  Table(v, p->iDb)
8b20: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
8b30: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
8b40: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53  ng8, 0, 0, p->pS
8b50: 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22  elect==0?"table"
8b60: 3a 22 76 69 65 77 22 2c 50 33 5f 53 54 41 54 49  :"view",P3_STATI
8b70: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
8b80: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
8b90: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a  ing8, 0, 0, p->z
8ba0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
8bb0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
8bc0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
8bd0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , p->zName, 0);.
8be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8bf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
8c00: 20 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   3, 0);..    if(
8c10: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
8c20: 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61    char *z = crea
8c30: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a  teTableStmt(p);.
8c40: 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74        n = z ? st
8c50: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20  rlen(z) : 0;.   
8c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c70: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8c80: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
8c90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8ca0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
8cb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
8cc0: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
8cd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
8ce0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
8cf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
8d00: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
8d10: 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56 49  0, 0, "CREATE VI
8d20: 45 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EW ", P3_STATIC)
8d30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8d50: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
8d60: 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41  ng8, 0, 0, "CREA
8d70: 54 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53  TE TABLE ", P3_S
8d80: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
8d90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
8da0: 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  nd!=0 );.      n
8db0: 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
8dc0: 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e   - Addr(pParse->
8dd0: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20  sNameToken.z) + 
8de0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
8df0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8e00: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
8e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e20: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
8e30: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
8e40: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  ken.z, n);.     
8e50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e60: 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  p(v, OP_Concat, 
8e70: 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2, 0);.    }.   
8e80: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8e90: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8ea0: 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c  , 5, 0, "tttit",
8eb0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
8ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ed0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
8ee0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
8ef0: 28 20 70 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20  ( p->iDb!=1 ){. 
8f00: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
8f10: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
8f20: 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  p->iDb);.    }. 
8f30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8f40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
8f50: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c   0, 0);..    sql
8f60: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
8f70: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
8f80: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
8f90: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
8fa0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
8fb0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
8fc0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
8fd0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
8fe0: 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  in==0 && pParse-
8ff0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
9000: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
9010: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
9020: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
9030: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
9040: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48  aDb[p->iDb].tblH
9050: 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c    p->zName, strl
9080: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
9090: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
90a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
90b0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
90c0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
90d0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
90e0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
90f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9100: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65    }.    for(pFKe
9110: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
9120: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
9130: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
9140: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
9150: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
9160: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
9170: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
9180: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
9190: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
91a0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
91b0: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
91c0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
91d0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
91e0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
91f0: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
9200: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
9210: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
9220: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
9230: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
9240: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
9250: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hanges;.  }.}../
9260: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
9270: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
9280: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
9290: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
92a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
92b0: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
92c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
92d0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
92e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
92f0: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
9300: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
9310: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
9320: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
9330: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
9340: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
9350: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
9360: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
9370: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
9380: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
9390: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
93a0: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
93b0: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
93c0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
93d0: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
93e0: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
93f0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
9400: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
9410: 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54  emp         /* T
9420: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
9430: 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  ARY view */.){. 
9440: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
9450: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
9460: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
9470: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
9480: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
9490: 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e;..  sqlite3Sta
94a0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
94b0: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
94c0: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
94d0: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
94e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
94f0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
9500: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
9510: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
9520: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
9530: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
9540: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
9550: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
9560: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
9570: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
9580: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
9590: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
95a0: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
95b0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
95c0: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
95d0: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
95e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
95f0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
9600: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
9610: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
9620: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
9630: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
9640: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
9650: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
9660: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
9670: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
9680: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
9690: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
96a0: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
96b0: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
96c0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
96d0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
96e0: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
96f0: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
9700: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
9710: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
9720: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
9730: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
9740: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
9750: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
9760: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
9770: 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ct);.  if( !pPar
9780: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
9790: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
97a0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
97b0: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
97c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
97d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
97e0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
97f0: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
9800: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
9810: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
9820: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
9830: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
9840: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
9850: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
9860: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
9870: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
9880: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
9890: 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20  ((int)sEnd.z) - 
98a0: 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  (int)pBegin->z;.
98b0: 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
98c0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
98d0: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
98e0: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
98f0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
9900: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
9910: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
9920: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
9930: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
9940: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
9950: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
9960: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
9970: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
9980: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
9990: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
99a0: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
99b0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
99c0: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
99d0: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
99e0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
99f0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
9a00: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
9a10: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
9a20: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
9a30: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
9a40: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
9a50: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
9a60: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
9a70: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
9a80: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
9a90: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
9aa0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
9ab0: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
9ac0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
9ad0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
9ae0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
9af0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
9b00: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
9b10: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
9b20: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
9b30: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
9b40: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
9b50: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
9b60: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
9b70: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
9b80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
9b90: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
9ba0: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
9bb0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
9bc0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
9bd0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
9be0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
9bf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
9c00: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
9c10: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
9c20: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
9c30: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
9c40: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
9c50: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
9c60: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
9c70: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
9c80: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
9c90: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
9ca0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
9cb0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
9cc0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
9cd0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
9ce0: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
9cf0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
9d00: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
9d10: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
9d20: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
9d30: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
9d40: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
9d50: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
9d60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
9d70: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
9d80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9d90: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
9da0: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
9db0: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
9dc0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
9dd0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
9de0: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
9df0: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
9e00: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
9e10: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
9e20: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
9e30: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
9e40: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
9e50: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
9e60: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
9e70: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
9e80: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
9e90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
9ea0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
9eb0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
9ec0: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
9ed0: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
9ee0: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
9ef0: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
9f00: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
9f10: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
9f20: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
9f30: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
9f40: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
9f50: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
9f60: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
9f70: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
9f80: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
9f90: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
9fa0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
9fb0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
9fc0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  (pEList);.  if( 
9fd0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20  pSel->pEList==0 
9fe0: 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c  ){.    pSel->pEL
9ff0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
a000: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
a010: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
a020: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  .  }.  pTable->n
a030: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c  Col = -1;.  pSel
a040: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
a050: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
a060: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
a070: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
a080: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
a090: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
a0a0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
a0b0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
a0c0: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
a0d0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
a0e0: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
a0f0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
a100: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
a110: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
a120: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
a130: 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74  lTab);.    DbSet
a140: 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d  Property(pParse-
a150: 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  >db, pTable->iDb
a160: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
a170: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
a180: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
a190: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
a1a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
a1b0: 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a  ctUnbind(pSel);.
a1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
a1d0: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
a1e0: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
a1f0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
a200: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
a210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
a220: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
a230: 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70   from the VIEW p
a240: 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Table..**.** Thi
a250: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a260: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79  led whenever any
a270: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20   other table or 
a280: 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64  view is modified
a290: 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61  ..** The view pa
a2a0: 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
a2b0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70  outine might dep
a2c0: 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20  end directly or 
a2d0: 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e  indirectly.** on
a2e0: 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72   the modified or
a2f0: 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73   deleted table s
a300: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  o we need to cle
a310: 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d  ar the old colum
a320: 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68  n.** names so th
a330: 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
a340: 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  recomputed..*/.s
a350: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
a360: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
a370: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
a380: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
a390: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
a3a0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
a3b0: 3d 30 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  =0 && pTable->pS
a3c0: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f  elect!=0 );.  fo
a3d0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
a3e0: 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  le->aCol; i<pTab
a3f0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
a400: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Col++){.    sqli
a410: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
a420: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
a430: 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  ree(pCol->zDflt)
a440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
a450: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
a460: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
a470: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
a480: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
a490: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
a4a0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
a4b0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
a4c0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
a4d0: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
a4e0: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
a4f0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
a500: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
a510: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
a520: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
a530: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
a540: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
a550: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
a560: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
a570: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a580: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
a590: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
a5a0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
a5b0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
a5c0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
a5d0: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
a5e0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
a5f0: 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52       sqliteViewR
a600: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
a610: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
a620: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
a630: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
a640: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
a650: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
a660: 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20  oken, look up a 
a670: 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20  table with that 
a680: 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f  name.  If not fo
a690: 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e  und, leave.** an
a6a0: 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70   error for the p
a6b0: 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e  arser to find an
a6c0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
a6d0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
a6e0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
a6f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
a700: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
a710: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
a720: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
a730: 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  e = sqlite3Table
a740: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
a750: 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ok);.  if( zName
a760: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a770: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
a780: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
a790: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  ->db, zName, 0);
a7a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
a7b0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
a7c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a7d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a7e0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
a7f0: 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20  e: %T", pTok);. 
a800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
a810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a820: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a830: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
a840: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
a850: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
a860: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
a870: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
a880: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
a890: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
a8a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
a8b0: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
a8c0: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
a8d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
a8e0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
a8f0: 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  t base;.  sqlite
a900: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a910: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
a920: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
a930: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
a940: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
a950: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
a960: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  e;.  assert( pNa
a970: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
a980: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
a990: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a9a0: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
a9b0: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
a9c0: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20  ].zDatabase);.. 
a9d0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
a9e0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a9f0: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  ble;.  iDb = pTa
aa00: 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  b->iDb;.  assert
aa10: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
aa20: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
aa30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
aa40: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
aa50: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
aa60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
aa70: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
aa80: 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  LE(pTab->iDb);. 
aa90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
aaa0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
aab0: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
aac0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
aad0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
aae0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
aaf0: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
ab00: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
ab10: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
ab20: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
ab30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
ab40: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
ab50: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ab60: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
ab70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ab80: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
ab90: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
aba0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
abb0: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
abc0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
abd0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
abe0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
abf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
ac00: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
ac10: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
ac20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
ac30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
ac40: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
ac50: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
ac60: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
ac70: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ac80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
ac90: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
aca0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
acb0: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
acc0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
acd0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
ace0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
acf0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
ad00: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
ad10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ad20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ad30: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
ad40: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
ad50: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
ad60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
ad70: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ad80: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
ad90: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
ada0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
adb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
adc0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
add0: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
ade0: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
adf0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
ae00: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
ae10: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
ae20: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
ae30: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
ae40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ae50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
ae60: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
ae70: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
ae80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
ae90: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
aea0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  p_table;.  }..  
aeb0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
aec0: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
aed0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
aee0: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
aef0: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
af00: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
af10: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
af20: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
af30: 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  c VdbeOpList dro
af40: 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  pTable[] = {.   
af50: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
af60: 20 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c      0, ADDR(13),
af70: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
af80: 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30  String8,    0, 0
af90: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
afa0: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
afb0: 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
afc0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
afd0: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
afe0: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
aff0: 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20   0}, /* 3 */.   
b000: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
b010: 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
b020: 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   0}, /* sqlite_m
b030: 61 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a  aster.tbl_name *
b040: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  /.      { OP_Ne,
b050: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
b060: 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  (12), 0},.      
b070: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
b080: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 74   0, 0,        "t
b090: 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20 20 20  rigger"},.      
b0a0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
b0b0: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
b0c0: 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  , /* sqlite_mast
b0d0: 65 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20 20 20  er.type */.     
b0e0: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
b0f0: 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20 30    0, ADDR(12), 0
b100: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
b110: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
b120: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
b130: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
b140: 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30    0, ADDR(13), 0
b150: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
b160: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
b170: 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(3),  0},.     
b180: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
b190: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
b1a0: 7d 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20  }, /* 12 */.    
b1b0: 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  };.    Index *pI
b1c0: 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20  dx;.    Trigger 
b1d0: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73  *pTrigger;.    s
b1e0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
b1f0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
b200: 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  , 0, pTab->iDb);
b210: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
b220: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
b230: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
b240: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
b250: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
b260: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
b270: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
b280: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
b290: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
b2a0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
b2b0: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
b2c0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
b2d0: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
b2e0: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
b2f0: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
b300: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
b310: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e  ger->iDb==pTab->
b320: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
b330: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
b340: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
b350: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
b360: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
b370: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
b380: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
b390: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
b3a0: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
b3b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b3c0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
b3d0: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
b3e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b3f0: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
b400: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
b410: 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
b420: 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
b430: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c   the.    ** tabl
b440: 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
b450: 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
b460: 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
b470: 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
b480: 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20     ** every row 
b490: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
b4a0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
b4b0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
b4c0: 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  ne being.    ** 
b4d0: 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
b4e0: 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
b4f0: 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  perately because
b500: 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
b510: 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
b520: 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
b530: 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
b540: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
b550: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  another.    ** d
b560: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
b570: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
b580: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54  asterTable(v, pT
b590: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61  ab->iDb);.    ba
b5a0: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
b5b0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
b5c0: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
b5d0: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
b5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
b5f0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
b600: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
b610: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
b620: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
b630: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
b640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b650: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b660: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  0, 0);.    if( !
b670: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
b680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b690: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
b6a0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
b6b0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  ->iDb);.      fo
b6c0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
b6d0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
b6e0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
b6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b700: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
b710: 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  troy, pIdx->tnum
b720: 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20  , pIdx->iDb);.  
b730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b740: 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
b750: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
b760: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
b770: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
b780: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
b790: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  the table..  **.
b7a0: 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
b7b0: 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  if the SQL state
b7c0: 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20  ment began with 
b7d0: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
b7e0: 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e  ord,.  ** then n
b7f0: 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64  o changes should
b800: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
b810: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
b820: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  plain ){.    sql
b830: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
b840: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
b850: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
b860: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
b870: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20  nChanges;.  }.  
b880: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
b890: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
b8a0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
b8b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
b8c0: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
b8d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b8e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b8f0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
b900: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
b910: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
b920: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
b930: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
b940: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
b950: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
b960: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
b970: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
b980: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
b990: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
b9a0: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
b9b0: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
b9c0: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
b9d0: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
b9e0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
b9f0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
ba00: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
ba10: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
ba20: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
ba30: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
ba40: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
ba50: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
ba60: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
ba70: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
ba80: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
ba90: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
baa0: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
bab0: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
bac0: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
bad0: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
bae0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
baf0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
bb00: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
bb10: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
bb20: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
bb30: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
bb40: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
bb50: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
bb60: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
bb70: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
bb80: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
bb90: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
bba0: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
bbb0: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
bbc0: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
bbd0: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
bbe0: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
bbf0: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
bc00: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
bc10: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
bc20: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
bc30: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
bc40: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
bc50: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
bc60: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
bc70: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
bc80: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
bc90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bca0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
bcb0: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
bcc0: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
bcd0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
bce0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
bcf0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
bd00: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
bd10: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
bd20: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
bd30: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
bd40: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
bd50: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
bd60: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
bd70: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
bd80: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
bd90: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  hms. */.){.  Tab
bda0: 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
bdb0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
bdc0: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
bdd0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
bde0: 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a  har *z;.  FKey *
bdf0: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73  pFKey = 0;..  as
be00: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
be10: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
be20: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
be30: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
be40: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
be50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
be60: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
be70: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
be80: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
be90: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
bea0: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
beb0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bec0: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
bed0: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
bee0: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
bef0: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
bf00: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
bf10: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
bf20: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
bf30: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
bf40: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
bf50: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
bf60: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
bf70: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
bf80: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
bf90: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
bfa0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bfb0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
bfc0: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
bfd0: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
bfe0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
bff0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
c000: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
c010: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
c020: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
c030: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
c040: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
c050: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
c060: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
c070: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
c080: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
c090: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
c0a0: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
c0b0: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
c0c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
c0d0: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
c0e0: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
c0f0: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
c100: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
c120: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
c130: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
c140: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
c150: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
c160: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
c170: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
c180: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
c190: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
c1a0: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
c1b0: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
c1c0: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
c1d0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
c1e0: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
c1f0: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
c200: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
c210: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
c220: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
c230: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
c240: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
c250: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
c260: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
c270: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
c280: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
c290: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
c2a0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
c2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
c2c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
c2d0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
c2e0: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
c2f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
c300: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
c310: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
c320: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
c330: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
c340: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
c350: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
c360: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
c370: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c380: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
c390: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
c3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c3b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
c3c0: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
c3d0: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
c3e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
c3f0: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
c400: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
c410: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
c420: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
c430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c440: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
c450: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
c460: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
c470: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
c480: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
c490: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
c4a0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
c4b0: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
c4c0: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
c4d0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
c4e0: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
c4f0: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
c500: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
c510: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
c520: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
c530: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
c540: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
c550: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
c560: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
c570: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
c580: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
c590: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
c5a0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
c5b0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
c5c0: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
c5d0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
c5e0: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
c5f0: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
c600: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
c610: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
c620: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
c630: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
c640: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
c650: 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
c660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c670: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c680: 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
c690: 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
c6a0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
c6b0: 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
c6c0: 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
c6d0: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
c6e0: 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
c6f0: 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
c700: 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
c710: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
c720: 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
c730: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
c740: 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
c750: 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
c760: 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
c770: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
c780: 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
c790: 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
c7a0: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
c7b0: 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
c7c0: 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
c7d0: 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  red){.  Table *p
c7e0: 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
c7f0: 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
c800: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
c810: 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
c820: 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
c830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c840: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
c850: 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
c860: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
c870: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
c880: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
c890: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
c8a0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
c8b0: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
c8c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c8d0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
c8e0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
c8f0: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
c900: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
c910: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
c920: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
c930: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
c940: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
c950: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
c960: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
c970: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
c980: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
c990: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
c9a0: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
c9b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
c9c0: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
c9d0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
c9e0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
c9f0: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
ca00: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
ca10: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
ca20: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
ca30: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
ca40: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
ca50: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
ca60: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
ca70: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
ca80: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
ca90: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
caa0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
cab0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
cac0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
cad0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
cae0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
caf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cb00: 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
cb10: 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
cb20: 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
cb30: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
cb40: 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
cb50: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
cb60: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
cb70: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
cb80: 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
cb90: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
cba0: 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
cbb0: 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20   *pTblName,  /* 
cbc0: 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
cbd0: 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
cbe0: 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
cbf0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
cc00: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
cc10: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
cc20: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
cc30: 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
cc40: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
cc50: 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
cc60: 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
cc70: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
cc80: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
cc90: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
cca0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ccb0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
ccc0: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
ccd0: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
cce0: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
ccf0: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
cd00: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
cd10: 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61  *pTab = 0; /* Ta
cd20: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
cd30: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
cd40: 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  ndex;   /* The i
cd50: 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
cd60: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
cd70: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
cd80: 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
cd90: 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
cda0: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
cdb0: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
cdc0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
cdd0: 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
cde0: 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
cdf0: 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
ce00: 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20  int isTemp;     
ce10: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74   /* True for a t
ce20: 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a  emporary index *
ce30: 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  /.  sqlite *db =
ce40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
ce50: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
ce60: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
ce70: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
ce80: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
ce90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
cea0: 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61  me = 0; /* Unqua
ceb0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
cec0: 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
ced0: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  te */..  if( pPa
cee0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
cef0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
cf00: 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
cf10: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
cf20: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
cf30: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
cf40: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
cf50: 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
cf60: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
cf70: 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
cf80: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
cf90: 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
cfa0: 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
cfb0: 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
cfc0: 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
cfd0: 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
cfe0: 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
cff0: 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
d000: 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
d010: 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
d020: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
d030: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
d040: 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
d050: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
d060: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
d070: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
d080: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
d090: 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
d0a0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
d0b0: 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ex;..    /* If t
d0c0: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
d0d0: 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
d0e0: 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
d0f0: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
d100: 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
d110: 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
d120: 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20  abase to 1..    
d130: 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  */.    pTab = sq
d140: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
d150: 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
d160: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ame);.    if( pN
d170: 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
d180: 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
d190: 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a  pTab->iDb==1 ){.
d1a0: 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
d1b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
d1c0: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
d1d0: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
d1e0: 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
d1f0: 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
d200: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
d210: 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
d220: 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
d230: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
d240: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  ex;.    }.    pT
d250: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
d260: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
d270: 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
d280: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
d290: 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
d2a0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
d2b0: 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
d2c0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
d2d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
d2e0: 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
d2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
d300: 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
d310: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
d320: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
d330: 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e      iDb = pTab->
d340: 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  iDb;.  }..  if( 
d350: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
d360: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
d370: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
d380: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
d390: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
d3a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d3b0: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
d3c0: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
d3d0: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
d3e0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
d3f0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
d400: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
d410: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
d420: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d430: 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
d440: 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
d450: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
d460: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
d470: 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54   }.  isTemp = pT
d480: 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f  ab->iDb==1;..  /
d490: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
d4a0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
d4b0: 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
d4c0: 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
d4d0: 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
d4e0: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
d4f0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
d500: 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
d510: 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
d520: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
d530: 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
d540: 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
d550: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
d560: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
d570: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
d580: 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
d590: 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
d5a0: 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
d5b0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
d5c0: 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
d5d0: 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
d5e0: 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
d5f0: 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
d600: 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
d610: 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
d620: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
d630: 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
d640: 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
d650: 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
d660: 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
d670: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
d680: 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
d690: 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
d6a0: 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
d6b0: 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26  /.  if( pName &&
d6c0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
d6d0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
d6e0: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
d6f0: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
d700: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
d710: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
d720: 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
d730: 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
d740: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
d750: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d  ndex */.    zNam
d760: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
d770: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
d780: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e->n);.    if( z
d790: 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
d7a0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
d7b0: 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61 6d  ;.    if( (pISam
d7c0: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
d7d0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
d7e0: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
d7f0: 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20  .zName))!=0 ){. 
d800: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
d810: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
d820: 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
d830: 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
d840: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
d850: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d860: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53    }.    if( (pTS
d870: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
d880: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
d890: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
d8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d8b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
d8c0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d8d0: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
d8e0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
d8f0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
d900: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
d910: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
d920: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
d930: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
d940: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
d950: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
d960: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
d970: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
d980: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
d990: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
d9a0: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22  rintf(zBuf,"%d)"
d9b0: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
d9c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
d9d0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
d9e0: 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   "(", pTab->zNam
d9f0: 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22  e, " autoindex "
da00: 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
da10: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
da20: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
da30: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
da40: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
da50: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
da60: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
da70: 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ->n);.  }..  /* 
da80: 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
da90: 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
daa0: 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
dab0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dac0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
dad0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
dae0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
daf0: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
db00: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
db10: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
db20: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
db30: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
db40: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
db50: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
db60: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
db70: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
db80: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
db90: 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
dba0: 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51   isTemp ) i = SQ
dbb0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
dbc0: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
dbd0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
dbe0: 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
dbf0: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
dc00: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
dc10: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
dc20: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
dc30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
dc40: 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
dc50: 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
dc60: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
dc70: 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
dc80: 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
dc90: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
dca0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
dcb0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
dcc0: 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
dcd0: 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
dce0: 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
dcf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
dd00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
dd10: 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
dd20: 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
dd30: 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
dd40: 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c  d.n = strlen(nul
dd50: 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
dd60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
dd70: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20  istAppend(0, 0, 
dd80: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
dd90: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
dda0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
ddb0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
ddc0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
ddd0: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
dde0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
ddf0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
de00: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
de10: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
de20: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
de40: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
de50: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70  eof(CollSeq*))*p
de60: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
de70: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
de80: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
de90: 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65  e_index;.  pInde
dea0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
deb0: 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79  nt*)&pIndex->key
dec0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74  Info.aColl[pList
ded0: 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64  ->nExpr];.  pInd
dee0: 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
def0: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  r*)&pIndex->aiCo
df00: 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  lumn[pList->nExp
df10: 72 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  r];.  strcpy(pIn
df20: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
df30: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
df40: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
df50: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
df60: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
df70: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
df80: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49   = onError;.  pI
df90: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
dfa0: 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49  = pName==0;.  pI
dfb0: 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b  ndex->iDb = iDb;
dfc0: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
dfd0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
dfe0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
dff0: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
e000: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
e010: 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
e020: 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
e030: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
e040: 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
e050: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
e060: 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
e070: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
e080: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e090: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
e0a0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
e0b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
e0c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
e0d0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
e0e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
e0f0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
e100: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
e110: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
e120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e130: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e140: 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
e150: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
e160: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
e170: 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  Name, pList->a[i
e180: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e190: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
e1a0: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
e1b0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
e1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
e1d0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
e1e0: 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
e1f0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29  st->a[i].pExpr )
e200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
e210: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e220: 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  r->pColl );.    
e230: 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
e240: 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69  o.aColl[i] = pLi
e250: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
e260: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  pColl;.    }else
e270: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
e280: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
e290: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
e2a0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .pColl;.    }.  
e2b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
e2c0: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
e2d0: 69 5d 20 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  i] );.  }.  pInd
e2e0: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
e2f0: 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ld = pList->nExp
e300: 72 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  r;..  /* Link th
e310: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
e320: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
e330: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
e340: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
e350: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
e360: 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
e370: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
e380: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65  lain ){.    Inde
e390: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
e3a0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
e3b0: 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d  &db->aDb[pIndex-
e3c0: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a  >iDb].idxHash, .
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
e3f0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
e400: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Index->zName)+1,
e410: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
e420: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
e430: 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
e440: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
e450: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
e460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
e470: 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e(pIndex);.     
e480: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
e490: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
e4a0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
e4b0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
e4c0: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nges;.  }..  /* 
e4d0: 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
e4e0: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
e4f0: 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
e500: 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
e510: 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
e520: 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
e530: 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
e540: 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
e550: 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
e560: 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
e570: 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
e580: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
e590: 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
e5a0: 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
e5b0: 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d  .  if( onError!=
e5c0: 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
e5d0: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
e5e0: 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
e5f0: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
e600: 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
e610: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
e620: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
e630: 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
e640: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65   pIndex;.  }else
e650: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74  {.    Index *pOt
e660: 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
e670: 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ex;.    while( p
e680: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
e690: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
e6a0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
e6b0: 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68  ce ){.      pOth
e6c0: 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
e6d0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  xt;.    }.    pI
e6e0: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
e6f0: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
e700: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
e710: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20   pIndex;.  }..  
e720: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
e730: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
e740: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
e750: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
e760: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
e770: 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  e_master" table 
e780: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f  on the disk.  So
e790: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
e7a0: 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61   the disk.  ** a
e7b0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
e7c0: 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  he table number 
e7d0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
e7e0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
e7f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
e800: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 54 62  init.busy && pTb
e810: 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
e820: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
e830: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
e840: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e850: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
e860: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
e870: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
e880: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
e890: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
e8a0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
e8b0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e8c0: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
e8d0: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
e8e0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
e8f0: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
e900: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
e910: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
e920: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
e930: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
e940: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
e950: 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
e960: 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
e970: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
e980: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
e990: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
e9a0: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
e9b0: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
e9c0: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
e9d0: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
e9e0: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
e9f0: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
ea00: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
ea10: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
ea20: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
ea30: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
ea40: 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
ea50: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
ea60: 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
ea70: 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
ea80: 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
ea90: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
eaa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
eab0: 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
eac0: 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
ead0: 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
eae0: 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
eaf0: 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
eb00: 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
eb10: 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
eb20: 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
eb30: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
eb40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
eb50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
eb60: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
eb70: 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a  int lbl1, lbl2;.
eb80: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
eb90: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
eba0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
ebb0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ebc0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
ebd0: 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
ebe0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
ebf0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
ec00: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
ec10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
ec20: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
ec30: 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20   iDb);.    }.   
ec40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ec50: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
ec60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
ec70: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ec80: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
ec90: 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
eca0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
ecb0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
ecc0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49  tring8, 0, 0, pI
ecd0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
ece0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ecf0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
ed00: 38 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  8, 0, 0, pTab->z
ed10: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
ed20: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ed30: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
ed40: 30 2c 20 69 44 62 2c 28 63 68 61 72 2a 29 26 70  0, iDb,(char*)&p
ed50: 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50  Index->tnum,P3_P
ed60: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e  OINTER);.    pIn
ed70: 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20  dex->tnum = 0;. 
ed80: 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
ed90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
eda0: 56 64 62 65 43 6f 64 65 28 76 2c 0a 20 20 20 20  VdbeCode(v,.    
edb0: 20 20 20 20 20 20 4f 50 5f 44 75 70 2c 20 20 20        OP_Dup,   
edc0: 20 20 20 20 30 2c 20 20 20 20 20 20 30 2c 0a 20      0,      0,. 
edd0: 20 20 20 20 20 20 20 20 20 4f 50 5f 49 6e 74 65           OP_Inte
ede0: 67 65 72 2c 20 20 20 69 44 62 2c 20 20 20 20 30  ger,   iDb,    0
edf0: 2c 0a 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20  ,.      0);.    
ee00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ee10: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
ee20: 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 1, 0,.        
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
ee40: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79  ar*)&pIndex->key
ee50: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
ee60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ee70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ee80: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
ee90: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  0);.    if( pSta
eea0: 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
eeb0: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
eec0: 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
eed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
eee0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
eef0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 22 2c 20  CREATE INDEX ", 
ef00: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ef10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ef20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ef30: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45  geP3(v, -1, "CRE
ef40: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
ef50: 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a   ", P3_STATIC);.
ef60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ef70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef80: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
ef90: 20 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41   0);.      n = A
efa0: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
efb0: 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  ddr(pName->z) + 
efc0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
efd0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
efe0: 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29  -1, pName->z, n)
eff0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f010: 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20  oncat, 2, 0);.  
f020: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
f030: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
f040: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22  eRecord, 5, 0, "
f050: 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49  tttit", P3_STATI
f060: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
f070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
f080: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
f090: 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
f0a0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
f0b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f0c0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
f0d0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
f0e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0f0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
f100: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
f110: 0a 20 20 20 20 20 20 2f 2a 20 56 64 62 65 43 6f  .      /* VdbeCo
f120: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
f130: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a  pTab->zName)); *
f140: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
f150: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
f160: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c  etNumColumns, 2,
f170: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
f180: 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74      lbl2 = sqlit
f190: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f1a0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
f1b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f1c0: 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32  _Rewind, 2, lbl2
f1d0: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
f1e0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f1f0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
f200: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
f210: 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64  IndexKey(v, pInd
f220: 65 78 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71  ex, 2);.      sq
f230: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
f240: 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
f250: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
f260: 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  E_None,.        
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
f280: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
f290: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
f2a0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
f2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f2c0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
f2d0: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
f2e0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f2f0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b  eLabel(v, lbl2);
f300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f310: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
f320: 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
f330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f340: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
f350: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
f360: 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
f370: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
f380: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
f390: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
f3a0: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
f3b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f3d0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
f3e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f3f0: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
f400: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
f410: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65   }.  }..  /* Cle
f420: 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
f430: 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
f440: 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  ate_index:.  sql
f450: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
f460: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 2f 2a 20  te(pList);.  /* 
f470: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
f480: 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 20 2a 2f  lete(pTable); */
f490: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
f4a0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
f4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
f4c0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
f4d0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
f4e0: 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
f4f0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
f500: 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
f510: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
f520: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
f530: 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
f540: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
f550: 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  pName){.  Index 
f560: 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
f570: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *v;.  sqlite *db
f580: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
f590: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
f5a0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
f5b0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
f5c0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
f5d0: 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
f5e0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
f5f0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
f600: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
f610: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
f620: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
f630: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
f640: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f650: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
f660: 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
f670: 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
f680: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
f690: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
f6a0: 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
f6b0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
f6c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f6d0: 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
f6e0: 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
f6f0: 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
f700: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
f710: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
f720: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
f730: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
f740: 65 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28  ex;.  }./*.  if(
f750: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29   pIndex->iDb>1 )
f760: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f770: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
f780: 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65  annot alter sche
f790: 6d 61 20 6f 66 20 61 74 74 61 63 68 65 64 20 22  ma of attached "
f7a0: 0a 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73  .       "databas
f7b0: 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  es", 0);.    got
f7c0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
f7d0: 78 3b 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64 65  x;.  }.*/.#ifnde
f7e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f7f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
f800: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
f810: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
f820: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
f830: 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
f840: 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
f850: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
f860: 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a  b[pIndex->iDb].z
f870: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
f880: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
f890: 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78  EMA_TABLE(pIndex
f8a0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  ->iDb);.    if( 
f8b0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f8c0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f8d0: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
f8e0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f8f0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
f900: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
f910: 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29  f( pIndex->iDb )
f920: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f930: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
f940: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f950: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f960: 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
f970: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
f980: 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
f990: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f9a0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
f9b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
f9c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
f9d0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
f9e0: 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
f9f0: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
fa00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
fa10: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
fa20: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
fa30: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
fa40: 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  Index[] = {.    
fa50: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
fa60: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
fa70: 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
fa80: 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 30  tring8,     0, 0
fa90: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31  ,       0}, /* 1
faa0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
fab0: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
fac0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
fad0: 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
fae0: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    1, 0,       0}
faf0: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
fb00: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
fb10: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   0, 1,       0},
fb20: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20  .      { OP_Eq, 
fb30: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
fb40: 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  8), 0},.      { 
fb50: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
fb60: 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20  , ADDR(3), 0},. 
fb70: 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
fb80: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
fb90: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
fba0: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
fbb0: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
fbc0: 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  8 */.    };.    
fbd0: 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73  int base;..    s
fbe0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
fbf0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
fc00: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  , 0, pIndex->iDb
fc10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  );.    sqlite3Op
fc20: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
fc30: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
fc40: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
fc50: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
fc60: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
fc70: 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65  Index), dropInde
fc80: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  x);.    sqlite3V
fc90: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
fca0: 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+1, pIndex->z
fcb0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
fcc0: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 21 3d 31  ( pIndex->iDb!=1
fcd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fce0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
fcf0: 2c 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  , v, pIndex->iDb
fd00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fd10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fd20: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
fd30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fd40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
fd50: 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  troy, pIndex->tn
fd60: 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
fd70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
fd80: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
fd90: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
fda0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
fdb0: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
fdc0: 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  on of this index
fdd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
fde0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
fdf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 6c 69  .    sqlite3Unli
fe00: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
fe10: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
fe20: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
fe30: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
fe40: 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ges;.  }..exit_d
fe50: 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
fe60: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
fe70: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
fe80: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
fe90: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
fea0: 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
feb0: 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
fec0: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
fed0: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
fee0: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
fef0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
ff00: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
ff10: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
ff20: 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73  ListAppend(IdLis
ff30: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
ff40: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
ff50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
ff60: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
ff70: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
ff80: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
ff90: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
ffa0: 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
ffb0: 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a  nAlloc = 0;.  }.
ffc0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64    if( pList->nId
ffd0: 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
ffe0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
fff0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
10000 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
10010 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
10020 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 5;.    a = s
10030 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
10040 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41  st->a, pList->nA
10050 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73  lloc*sizeof(pLis
10060 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
10070 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
10080 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
10090 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
100a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
100b0 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
100c0 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   = a;.  }.  mems
100d0 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
100e0 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a  st->nId], 0, siz
100f0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
10100 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
10110 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
10120 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
10130 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a  st->nId].zName;.
10140 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
10150 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e  tring(pz, pToken
10160 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
10170 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
10180 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10190 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
101a0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
101b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
101c0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
101d0 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
101e0 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
101f0 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
10200 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
10210 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
10220 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
10230 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
10240 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
10250 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
10260 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
10270 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
10280 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
10290 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
102a0 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
102b0 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
102c0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
102d0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
102e0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
102f0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
10300 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
10310 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
10320 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
10330 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
10340 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
10350 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
10360 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
10370 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
10380 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
10390 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
103a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
103b0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
103c0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
103d0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
103e0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
103f0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
10400 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
10410 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
10420 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
10430 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
10440 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
10450 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
10460 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
10470 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
10480 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
10490 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
104a0 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
104b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
104c0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
104d0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
104e0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
104f0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
10500 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
10510 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
10520 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
10530 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
10540 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
10550 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
10560 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
10570 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
10580 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
10590 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
105a0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
105b0 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
105c0 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
105d0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
105e0 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73  istAppend(SrcLis
105f0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
10600 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a  *pTable, Token *
10610 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69 66  pDatabase){.  if
10620 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
10630 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
10640 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
10650 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
10660 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
10670 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
10680 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
10690 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
106a0 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
106b0 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
106c0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
106d0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
106e0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
106f0 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
10700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10710 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
10720 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
10730 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
10740 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
10750 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
10760 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
10770 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
10780 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10790 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
107a0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d   = pNew;.  }.  m
107b0 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
107c0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c  pList->nSrc], 0,
107d0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
107e0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61  [0]));.  if( pDa
107f0 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
10800 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
10810 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
10820 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
10830 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b  ase && pTable ){
10840 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
10850 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
10860 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
10870 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
10880 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
10890 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
108a0 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
108b0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
108c0 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  nSrc].zName;.   
108d0 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
108e0 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a  ng(pz, pTable->z
108f0 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b  , pTable->n, 0);
10900 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
10910 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10920 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
10930 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
10940 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
10950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10960 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
10970 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  }.  }.  if( pDat
10980 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68 61  abase ){.    cha
10990 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
109a0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
109b0 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 73  zDatabase;.    s
109c0 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
109d0 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e  (pz, pDatabase->
109e0 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c  z, pDatabase->n,
109f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
10a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10a10 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
10a20 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
10a30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
10a40 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10a50 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  e3Dequote(*pz);.
10a60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
10a70 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
10a80 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
10a90 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
10aa0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
10ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
10ac0 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20   cursors to all 
10ad0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
10ae0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
10af0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
10b00 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
10b10 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
10b20 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
10b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
10b40 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
10b50 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
10b60 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29  a[i].iCursor<0 )
10b70 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  {.      pList->a
10b80 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50  [i].iCursor = pP
10b90 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
10ba0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10bb0 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
10bc0 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
10bd0 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
10be0 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
10bf0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
10c00 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
10c10 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
10c20 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
10c30 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
10c40 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
10c50 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c  {.    int i = pL
10c60 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20  ist->nSrc - 1;. 
10c70 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
10c80 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
10c90 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e  ].zAlias, pToken
10ca0 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
10cb0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
10cc0 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b  equote(pList->a[
10cd0 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  i].zAlias);.  }.
10ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10cf0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
10d00 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
10d10 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
10d20 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
10d30 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
10d40 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
10d50 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
10d60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10d70 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
10d80 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
10d90 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
10da0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
10db0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
10dc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10dd0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
10de0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
10df0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
10e00 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
10e10 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
10e20 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
10e30 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
10e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
10e50 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
10e60 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
10e70 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
10e80 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
10e90 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
10ea0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
10eb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
10ec0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
10ed0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
10ee0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
10ef0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
10f00 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
10f10 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
10f20 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
10f30 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
10f40 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
10f50 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
10f60 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
10f70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
10f80 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
10f90 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
10fa0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
10fb0 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[i].zDatabase
10fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
10fd0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
10fe0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
10ff0 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
11000 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
11010 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  ( pList->a[i].pT
11020 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  ab && pList->a[i
11030 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
11040 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
11050 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
11060 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  0, pList->a[i].p
11070 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
11080 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
11090 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
110a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
110b0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
110c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29  pList->a[i].pOn)
110d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
110e0 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
110f0 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
11100 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
11110 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
11120 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
11130 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
11140 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
11150 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
11160 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
11170 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
11180 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
11190 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
111a0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
111b0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
111c0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
111d0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
111e0 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
111f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
11200 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11210 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11220 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
11230 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65  GIN", 0, 0) ) re
11240 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
11250 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11260 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
11270 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
11280 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11290 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
112a0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
112b0 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
112c0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
112d0 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
112e0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
112f0 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
11300 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
11310 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
11320 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
11330 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
11340 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
11350 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
11360 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
11370 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
11380 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
11390 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
113a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
113b0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
113c0 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
113d0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
113e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
113f0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
11400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11410 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
11420 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
11430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
11440 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
11450 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11460 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
11470 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
11480 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
11490 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
114a0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
114b0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
114c0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
114d0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
114e0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
114f0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
11500 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
11510 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
11520 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11530 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
11540 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
11550 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
11560 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
11570 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11580 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
11590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
115a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
115b0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
115c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
115d0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
115e0 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
115f0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
11600 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20  ie and start.** 
11610 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11620 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64  on for all named
11630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
11640 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
11650 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
11660 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62  schema cookies b
11670 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61  e verified and a
11680 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73  ll.** read trans
11690 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74  actions be start
116a0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  ed before anythi
116b0 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20  ng else happens 
116c0 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70  in.** the VDBE p
116d0 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69  rogram.  But thi
116e0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
116f0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75   called after mu
11700 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65  ch other.** code
11710 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61   has been genera
11720 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73  ted.  So here is
11730 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a   what we do:.**.
11740 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
11750 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
11760 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64  s called, we cod
11770 65 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 68  e an OP_Gosub th
11780 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
11790 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
117a0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
117b0 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
117c0 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
117d0 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
117e0 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
117f0 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
11800 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
11810 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
11820 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
11830 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
11840 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
11850 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
11860 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
11870 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
11880 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
11890 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
118a0 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
118b0 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
118c0 73 75 62 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  sub P2 value.** 
118d0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
118e0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
118f0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
11900 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
11910 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
11920 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
11930 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
11940 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
11950 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69  Coding()..*/.voi
11960 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
11970 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
11980 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
11990 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
119a0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
119b0 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
119c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
119d0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
119e0 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
119f0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
11a00 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
11a10 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
11a20 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
11a30 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  b;.  assert( iDb
11a40 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
11a50 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
11a60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
11a70 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
11a80 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33  .  assert( iDb<3
11a90 32 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  2 );.  if( pPars
11aa0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 3d 3d 30  e->cookieMask==0
11ab0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
11ac0 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
11ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11ae0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
11af0 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 31 3c  .  }.  mask = 1<
11b00 3c 69 44 62 3b 0a 20 20 69 66 28 20 28 70 50 61  <iDb;.  if( (pPa
11b10 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
11b20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
11b30 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
11b40 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
11b50 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
11b60 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
11b70 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
11b80 5f 63 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 7d 0a 0a  _cookie;.  }.}..
11b90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
11ba0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
11bb0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
11bc0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
11bd0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
11be0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
11bf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11c00 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
11c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
11c20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
11c30 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
11c40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
11c50 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
11c60 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
11c70 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
11c80 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
11c90 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
11ca0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
11cb0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
11cc0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
11cd0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
11ce0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
11cf0 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
11d00 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
11d10 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
11d20 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
11d30 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
11d40 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
11d50 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
11d60 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
11d70 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
11d80 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
11d90 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
11da0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
11db0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
11dc0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
11dd0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
11de0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
11df0 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
11e00 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
11e10 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
11e20 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
11e30 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  be set..**.** On
11e40 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ly database iDb 
11e50 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
11e60 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
11e70 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20  ritable by this 
11e80 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d  call..** If iDb=
11e90 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  =0, then the mai
11ea0 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62  n and temp datab
11eb0 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72  ases are made wr
11ec0 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20  itable.   If.** 
11ed0 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79  iDb==1 then only
11ee0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
11ef0 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  se is made writa
11f00 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74  ble.  If iDb>1 t
11f10 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  hen the.** speci
11f20 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64  fied auxiliary d
11f30 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
11f40 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
11f50 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
11f60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11f70 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
11f80 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
11f90 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
11fa0 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
11fb0 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
11fc0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
11fd0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
11fe0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11ff0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
12000 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
12010 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
12020 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
12030 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
12040 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
12050 73 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  setStatement ){.
12060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12070 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
12080 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
12090 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20   }.  if( iDb!=1 
120a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
120b0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
120c0 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
120d0 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
120e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
120f0 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
12100 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
12110 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
12120 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
12130 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20  database.  If a 
12140 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12150 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
12160 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20  d, then emit.** 
12170 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61  an OP_Commit tha
12180 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
12190 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63   changes to be c
121a0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
121b0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
121c0 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72  t checkpoints ar
121d0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
121e0 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65  committed at the
121f0 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61   end of.** a sta
12200 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c  tement.  Note al
12210 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61  so that there ca
12220 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61  n be multiple ca
12230 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
12240 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
12250 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72  ation() but ther
12260 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
12270 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c   a single.** cal
12280 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57  l to sqlite3EndW
12290 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20  riteOperation() 
122a0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
122b0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
122c0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
122d0 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
122e0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
122f0 73 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74 65  se){.  /* Delete
12300 20 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75 72 6e   me! */.  return
12310 3b 0a 7d 0a                                      ;.}.