/ Hex Artifact Content
Login

Artifact 5d958f480d71f56981f262de6994a4d2ee6e5f75:


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 34 20 32 30 30 34 2f 30 36 2f 31 30 20 30  214 2004/06/10 0
0300: 32 3a 31 36 3a 30 32 20 64 61 6e 69 65 6c 6b 31  2:16:02 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 23 69 66 20 30 0a 20 20 69 66 28 28 64 62 2d 3e  #if 0.  if((db->
04c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
04d0: 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 26  nitialized)==0 &
04e0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
04f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
0500: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
0510: 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  b, &pParse->zErr
0520: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
0530: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0540: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0550: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72  = rc;.      pPar
0560: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0570: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  }.  }.#endif.  f
0580: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0590: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 43  b; i++){.    DbC
05a0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
05b0: 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a   i, DB_Locked);.
05c0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62      if( !db->aDb
05d0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  [i].inTrans ){. 
05e0: 20 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70       DbClearProp
05f0: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 43  erty(db, i, DB_C
0600: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ookie);.    }.  
0610: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  }.  pParse->nVar
0620: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
0630: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0640: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0650: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0660: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0670: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0680: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0690: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
06a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
06b0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
06c0: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
06d0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
06e0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
06f0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0700: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0710: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0720: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0730: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0740: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0750: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0760: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0770: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0780: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
07a0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
07b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
07c0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
07d0: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
07e0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
07f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0800: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0810: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0820: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0830: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0840: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0850: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
0860: 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
0870: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0880: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
0890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
08a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  ddOp(v, OP_Halt,
08b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
08c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
08d0: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  sk!=0 ){.      u
08e0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08f0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
0900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0910: 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  2(v, pParse->coo
0920: 6b 69 65 47 6f 74 6f 2c 20 73 71 6c 69 74 65 33  kieGoto, sqlite3
0930: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
0940: 76 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  v));.      for(i
0950: 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44  Db=0, mask=1; iD
0960: 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c  b<db->nDb; mask<
0970: 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20  <=1, iDb++){.   
0980: 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26       if( (mask &
0990: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
09a0: 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ask)==0 ) contin
09b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
09c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
09d0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
09e0: 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61  iDb, (mask & pPa
09f0: 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21  rse->writeMask)!
0a00: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
0a10: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
0a40: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70  fyCookie, iDb, p
0a50: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
0a60: 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20  ue[iDb]);.      
0a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a90: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0aa0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0ab0: 47 6f 74 6f 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Goto+1);.    }. 
0ac0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
0ad0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0ae0: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0af0: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0b00: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0b10: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0b20: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0b30: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0b40: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0b50: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0b60: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0b70: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0b80: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0b90: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0ba0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0bb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0bc0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0bd0: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0be0: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0bf0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0c00: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0c10: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0c30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0c40: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0c50: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0c60: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0c70: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0c80: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0c90: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0ca0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0cb0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0cc0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ce0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0cf0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d00: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0d10: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0d20: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0d30: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0d40: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0d50: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0d60: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0d70: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0d80: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0d90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0da0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0db0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0dc0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0dd0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0de0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0df0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0e00: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0e10: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0e20: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0e30: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0e40: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0e50: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0e60: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0e70: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0e80: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0e90: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0ea0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0eb0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0ec0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
0ed0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
0ee0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
0ef0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
0f00: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
0f10: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
0f20: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
0f30: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
0f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 61 64  rc = sqlite3Read
0f60: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
0f70: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
0f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
0f90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0fa0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0fb0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0fc0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0fd0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0fe0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0ff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1000: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1010: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1030: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1040: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1050: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1060: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1070: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
10a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
10b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
10c0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
10d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
10e0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
10f0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
1100: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1110: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1120: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1130: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
1140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1150: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1160: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
1170: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1180: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1190: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
11a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
11b0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
11c0: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
11d0: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
11e0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
11f0: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1200: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1210: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
1220: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
1230: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1240: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
1250: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1260: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1280: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1290: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
12a0: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
12b0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
12c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
12d0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
12e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
12f0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
1300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1310: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1320: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1330: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1340: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1350: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1360: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1370: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1380: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1390: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
13a0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
13b0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
13c0: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
13d0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
13e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1400: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1410: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1420: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1430: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1440: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1450: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
14a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
14b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
14c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
14d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
14e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
14f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
15a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
15b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
15c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
15d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
15e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
15f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1640: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
1650: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1670: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1680: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1690: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
16a0: 61 64 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  adSchema(db, 0);
16b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
16c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
16d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16e0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
16f0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
1700: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
1710: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
1720: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
1730: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1740: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1760: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1770: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69  nd(&db->aDb[j].i
1780: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1790: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
17a0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
17b0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
17c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   p;.}../*.** Rem
17d0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
17e0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
17f0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
1800: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
1810: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
1820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1830: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1840: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1850: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1860: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1870: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1880: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1890: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
18a0: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
18b0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
18c0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
18d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
18e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
18f0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
1900: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1910: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20   Index *pOld;.. 
1920: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26   assert( db!=0 &
1930: 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  & p->zName!=0 );
1940: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
1950: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
1960: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
1970: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
19a0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
19b0: 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20  ;.  if( pOld!=0 
19c0: 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20  && pOld!=p ){.  
19d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
19e0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
19f0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f  iDb].idxHash, pO
1a00: 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ld->zName,.     
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61  strlen(pOld->zNa
1a30: 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20  me)+1, pOld);.  
1a40: 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41  }.  if( p->zColA
1a50: 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
1a60: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1a70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1a80: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1a90: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1aa0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
1ab0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
1ac0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
1ad0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1ae0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1af0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1b00: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
1b20: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1b30: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1b40: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1b50: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
1b60: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
1b70: 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  x ){.    pIndex-
1b80: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1b90: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
1bb0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  dex *p;.    for(
1bc0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
1bd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
1be0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
1bf0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
1c00: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
1c10: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
1c20: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
1c30: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c50: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1c60: 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  , pIndex);.}../*
1c70: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
1c80: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
1c90: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
1ca0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1cb0: 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  of.** database c
1cc0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
1cd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ce0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
1cf0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
1d00: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  he connection cl
1d10: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
1d20: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
1d30: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
1d40: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
1d50: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
1d60: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1d70: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  n..**.** If iDb<
1d80: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
1d90: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
1da0: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
1db0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dc0: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74  es.  If iDb>=2 t
1dd0: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
1de0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
1df0: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
1e00: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
1e10: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1e20: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
1e30: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e40: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e50: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e60: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e70: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1e80: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1e90: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ea0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1eb0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ec0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ed0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1ee0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1ef0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f00: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f10: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f20: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f30: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f40: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
1f50: 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73  it(&pDb->trigHas
1f60: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
1f70: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
1f80: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
1f90: 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20  &pDb->aFKey);.  
1fa0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
1fb0: 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68  ar(&pDb->idxHash
1fc0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
1fd0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1fe0: 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b  (&temp2); pElem;
1ff0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2000: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2010: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54       Trigger *pT
2020: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48  rigger = sqliteH
2030: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
2050: 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67  eteTrigger(pTrig
2060: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
2070: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2080: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
2090: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
20a0: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  Db->tblHash, SQL
20b0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
20c0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c   0);.    for(pEl
20d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
20e0: 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65  st(&temp1); pEle
20f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2100: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2110: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2120: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
2130: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2140: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2150: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2160: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2170: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2180: 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50  1);.    DbClearP
2190: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
21a0: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b  B_SchemaLoaded);
21b0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
21c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
21d0: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
21e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
21f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2200: 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  anges;..  /* If 
2210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
2220: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2230: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
2240: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
2250: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
2260: 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  en from the auxi
2270: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
2280: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
2290: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
22a0: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
22b0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
22c0: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
22d0: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
22e0: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
22f0: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
2300: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
2310: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
2320: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
2330: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2340: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
2350: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2360: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2370: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2380: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
23a0: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
23b0: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
23c0: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
23d0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
23e0: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
23f0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
2400: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
2410: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
2420: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2430: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
2440: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
2450: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44     sqliteFree(pD
2460: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2470: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
2480: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2490: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
24a0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
24b0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
24c0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
24d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
24e0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
24f0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
2500: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
2510: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
2520: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
2530: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
2540: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
2550: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
2560: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
2570: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
2580: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
2590: 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29  iteFree(db->aDb)
25a0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
25b0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
25c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
25d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25e0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
25f0: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20  llback occurs.  
2600: 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a  If there were.**
2610: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2620: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
2630: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20  action, then we 
2640: 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68  have to reset th
2650: 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61  e.** internal ha
2660: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65  sh tables and re
2670: 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64  load them from d
2680: 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  isk..*/.void sql
2690: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  ite3RollbackInte
26a0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
26b0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
26c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
26d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
26e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
26f0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2700: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
2710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2720: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2730: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
2740: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
2750: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
2760: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2770: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
2780: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
2790: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
27a0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
27b0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
27c0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
27d0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
27e0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
27f0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2800: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2810: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2820: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2830: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2840: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
2850: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
2860: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
2870: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
2880: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
2890: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
28a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
28b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
28c0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
28d0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
28e0: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
28f0: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2900: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2910: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2920: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2930: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2940: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
2950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2960: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
2970: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
2980: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2990: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
29a0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
29b0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
29c0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
29d0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
29e0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
29f0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2a00: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2a10: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2a20: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2a30: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2a40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2a50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
2a60: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
2a70: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
2a80: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
2a90: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
2aa0: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
2ab0: 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54  tFKey;..  if( pT
2ac0: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
2ad0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
2ae0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
2af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2b00: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
2b10: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
2b20: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
2b30: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
2b40: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
2b50: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2b60: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
2b70: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
2b80: 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62   || (pTable->iDb
2b90: 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  ==0 && pIndex->i
2ba0: 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71  Db==1) );.    sq
2bb0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2bc0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
2bd0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2be0: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
2bf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c00: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
2c10: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
2c20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
2c30: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
2c40: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
2c50: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
2c60: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
2c70: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
2c80: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
2c90: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
2ca0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
2cb0: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
2cc0: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62  ( pTable->iDb<db
2cd0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
2ce0: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
2cf0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
2d00: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
2d10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
2d30: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
2d40: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
2d50: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
2d60: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
2d70: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
2d80: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2d90: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
2da0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2db0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
2dc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2dd0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
2de0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
2df0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e00: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
2e10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2e30: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
2e40: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
2e60: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2e70: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ol);.  if( pTabl
2e80: 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20  e->zColAff ){.  
2e90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2ea0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
2eb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2ec0: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
2ed0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
2ee0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
2ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
2f00: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
2f10: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
2f20: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
2f30: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
2f40: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
2f50: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
2f60: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
2f70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2f80: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
2f90: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
2fa0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
2fb0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
2fc0: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
2fd0: 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20  *pF2;.  int i = 
2fe0: 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  p->iDb;.  assert
2ff0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
3000: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
3010: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
3020: 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].tblHash, p->zN
3030: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
3040: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
3050: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
3060: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
3070: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
3080: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
3090: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69  NextFrom){.    i
30a0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
30b0: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
30c0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
30d0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
30e0: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
30f0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3100: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
3110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
3120: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
3130: 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  [i].aFKey, pF1->
3140: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
3150: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c  NextTo);.    }el
3160: 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
3170: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
3180: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
3190: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
31a0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29  .      if( pF2 )
31b0: 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70  {.        pF2->p
31c0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
31d0: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  extTo;.      }. 
31e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
31f0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
3200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , p);.}../*.** C
3210: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d  onstruct the nam
3220: 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c  e of a user tabl
3230: 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
3240: 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53  a token..**.** S
3250: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3260: 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65   name is obtaine
3270: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3280: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a  loc() and must.*
3290: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
32a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
32b0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
32c0: 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f  ite3TableNameFro
32d0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
32e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
32f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
3300: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
3310: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74  ame->n);.  sqlit
3320: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3330: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
3350: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3360: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
3370: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
3380: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
3390: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
33a0: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
33b0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
33c0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
33d0: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
33e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
33f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3400: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
3410: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
3420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3430: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
3440: 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71  STER_ROOT);.  sq
3450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3460: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
3470: 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71  ns, 0, 5); /* sq
3480: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
3490: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a  5 columns */.}..
34a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
34b0: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
34c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
34d0: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
34e0: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
34f0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
3500: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
3510: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
3520: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
3530: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
3540: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
3550: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
3560: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
3570: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
3580: 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62  t..*/.int findDb
3590: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
35a0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
35b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
35c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
35d0: 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d  {.    if( pName-
35e0: 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61  >n==strlen(db->a
35f0: 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20  Db[i].zName) && 
3600: 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69  .        0==sqli
3610: 74 65 33 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e  te3StrNICmp(db->
3620: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  aDb[i].zName, pN
3630: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3640: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3650: 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n i;.    }.  }. 
3660: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69   return -1;.}..i
3670: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
3680: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
3690: 70 50 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e  pParse, .  Token
36a0: 20 2a 70 4e 61 6d 65 31 2c 20 0a 20 20 54 6f 6b   *pName1, .  Tok
36b0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 0a 20 20 54  en *pName2, .  T
36c0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a 29  oken **pUnqual.)
36d0: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  {.  int iDb;.  s
36e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
3700: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
3710: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
3720: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
3730: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
3740: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
3750: 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64    iDb = findDb(d
3760: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
3770: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
3780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3790: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
37a0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
37b0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
37c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
37d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
37e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
37f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3800: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
3810: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
3820: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
3830: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
3840: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
3850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
3860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
3870: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
3880: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
3890: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
38a0: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
38b0: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
38c0: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
38d0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
38e0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
38f0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
3900: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
3910: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
3920: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
3930: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
3940: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
3950: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
3960: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
3970: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
3980: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
3990: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
39a0: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
39b0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
39c0: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
39d0: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
39e0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
39f0: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
3a00: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
3a10: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
3a20: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
3a30: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
3a40: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
3a50: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
3a60: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
3a70: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
3a80: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
3a90: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
3aa0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
3ab0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
3ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3ad0: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
3ae0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
3af0: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
3b00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3b10: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
3b20: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
3b30: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
3b40: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
3b50: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
3b60: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
3b70: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
3b80: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
3b90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3ba0: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
3bb0: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
3bc0: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
3bd0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
3be0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
3bf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
3c00: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
3c10: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
3c20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3c30: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
3c40: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
3c50: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
3c60: 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e  e "CREATE" token
3c70: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
3c80: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
3c90: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
3ca0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
3cb0: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
3cc0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
3cd0: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
3ce0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
3cf0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
3d00: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
3d10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
3d20: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
3d30: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
3d40: 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w       /* True 
3d50: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
3d60: 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  W */.){.  Table 
3d70: 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78  *pTable;.  Index
3d80: 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a   *pIdx;.  char *
3d90: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20  zName;.  sqlite 
3da0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3db0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
3dc0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
3dd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
3de0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
3df0: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
3e00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
3e10: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
3e20: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3e30: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
3e40: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72   /* The table or
3e50: 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72   view name to cr
3e60: 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74  eate is passed t
3e70: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
3e80: 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70  ia tokens.  ** p
3e90: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
3ea0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
3eb0: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
3ec0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
3ed0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
3ee0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
3ef0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  .yyy (...);.  **
3f00: 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d   .  ** Then pNam
3f10: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
3f20: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
3f30: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
3f40: 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74  r hand if.  ** t
3f50: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
3f60: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
3f70: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a  fied, i.e.:.  **
3f80: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
3f90: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a  LE yyy(...);.  *
3fa0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  *.  ** Then pNam
3fb0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
3fc0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
3fd0: 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ""..  **.  ** T
3fe0: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65  he call below se
3ff0: 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69  ts the pName poi
4000: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
4010: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
4020: 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65  e1 or.  ** pName
4030: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4040: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4050: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76  able name. The v
4060: 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20  ariable iDb is. 
4070: 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69   ** set to the i
4080: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
4090: 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61  base that the ta
40a0: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74  ble or view is t
40b0: 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  o be.  ** create
40c0: 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  d in..  */.  iDb
40d0: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
40e0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
40f0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
4100: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
4110: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <0 ) return;.  i
4120: 66 28 20 69 73 54 65 6d 70 20 26 26 20 69 44 62  f( isTemp && iDb
4130: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
4140: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
4150: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
4160: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
4170: 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  fied */.    sqli
4180: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4190: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
41a0: 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  able name must b
41b0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b  e unqualified");
41c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
41d0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
41e0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d  .  }.  if( isTem
41f0: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
4200: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
4210: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
4220: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54 61  Name = sqlite3Ta
4230: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
4240: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
4250: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
4260: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
4270: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
4280: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
4290: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
42a0: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
42b0: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
42c0: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
42d0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
42e0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
42f0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
4300: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
4310: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
4320: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
4330: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
4340: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
4350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
4360: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
4370: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
4380: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
4390: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
43a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
43b0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
43c0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
43d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
43e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
43f0: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
4400: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
4410: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
4420: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
4430: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
4440: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
4450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4460: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
4470: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4490: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
44a0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
44b0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
44c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
44d0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
44e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
44f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
4500: 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20  * Before trying 
4510: 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70  to create a temp
4520: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b  orary table, mak
4530: 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65  e sure the Btree
4540: 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   for.  ** holdin
4550: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
4560: 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f  es is open..  */
4570: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26  .  if( isTemp &&
4580: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
4590: 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
45a0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
45b0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
45c0: 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
45d0: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
45e0: 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
45f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
4600: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
4610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4620: 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
4630: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
4640: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
4650: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
4660: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
4670: 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
4680: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4690: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
46a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
46b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
46c0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
46d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
46e0: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
46f0: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
4700: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
4710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4720: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4730: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4740: 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
4750: 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
4760: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
4770: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
4780: 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
4790: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
47a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
47b0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
47c0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
47d0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
47e0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
47f0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
4800: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
4810: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
4820: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
4830: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
4840: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   ** it does..  *
4850: 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  /.  pTable = sql
4860: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
4870: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
4880: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
4890: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
48a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
48b0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
48c0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
48d0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
48e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
48f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
4900: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
4910: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
4920: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
4930: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
4940: 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20    (pIdx->iDb==0 
4950: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
4960: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
4970: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4980: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
4990: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
49a0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
49b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
49c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
49d0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
49e0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
49f0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
4a00: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
4a10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
4a20: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
4a30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
4a40: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
4a50: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  me;.  pTable->nC
4a60: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
4a70: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
4a80: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
4a90: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
4aa0: 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ex = 0;.  pTable
4ab0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69  ->iDb = iDb;.  i
4ac0: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
4ad0: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65  able ) sqlite3De
4ae0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
4af0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4b00: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
4b10: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
4b20: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
4b30: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
4b40: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
4b50: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
4b60: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
4b70: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
4b80: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
4b90: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
4ba0: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
4bb0: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
4bc0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
4bd0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
4be0: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
4bf0: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
4c00: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
4c10: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
4c20: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
4c30: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
4c40: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
4c50: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
4c60: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
4c70: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
4c80: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
4c90: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
4ca0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
4cb0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
4cc0: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
4cd0: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
4ce0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
4cf0: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
4d00: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
4d10: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  se))!=0 ){.    s
4d20: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
4d30: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
4d40: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  , 0, iDb);.    i
4d50: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
4d60: 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d      /* Every tim
4d70: 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73  e a new table is
4d80: 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 6c   created the fil
4d90: 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 20 20 2a  e-format.      *
4da0: 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d  * and encoding m
4db0: 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73  eta-values are s
4dc0: 65 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  et in the databa
4dd0: 73 65 2c 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  se, in.      ** 
4de0: 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65  case this is the
4df0: 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65   first table cre
4e00: 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ated..      */. 
4e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
4e30: 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  ger, db->file_fo
4e40: 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rmat, 0);.      
4e50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e60: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
4e70: 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20  , iDb, 1);.     
4e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e90: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
4ea0: 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20   db->enc, 0);.  
4eb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ec0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4ed0: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20  okie, iDb, 4);. 
4ee0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4ef0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4f00: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  v, iDb);.    sql
4f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4f20: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
4f30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4f40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4f50: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
4f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f70: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
4f80: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4f90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4fa0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
4fb0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
4fc0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
4fd0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
4fe0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
4ff0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
5000: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
5010: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
5020: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
5030: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
5040: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
5050: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5060: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
5070: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
5080: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
5090: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
50a0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
50b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
50c0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
50d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
50e0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
50f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5100: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
5110: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
5120: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f  har *z = 0;.  Co
5130: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
5140: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
5150: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
5160: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
5170: 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70  SetNString(&z, p
5180: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
5190: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n, 0);.  if( z==
51a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
51b0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
51c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
51d0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
51e0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
51f0: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
5200: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
5210: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
5230: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
5240: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
5250: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5260: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
5270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5280: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
5290: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
52a0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
52b0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
52c0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
52d0: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
52e0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
52f0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
5300: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
5310: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
5320: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
5330: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
5340: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
5350: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
5360: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
5370: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
5380: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
5390: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
53a0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
53b0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
53c0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
53d0: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
53e0: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
53f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
5400: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
5410: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
5420: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
5430: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
5440: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
5450: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
5460: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70  _NONE;.  pCol->p
5470: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
5480: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5490: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
54a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
54b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
54c0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
54d0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
54e0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
54f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5500: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
5510: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
5520: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
5530: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
5540: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5550: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
5560: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5570: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5580: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
55a0: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
55b0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
55c0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
55d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
55e0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
55f0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5600: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5610: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5620: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
5630: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
5640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5660: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
5670: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
5680: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
5690: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
56a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
56b0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
56c0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
56d0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
56e0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
56f0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
5700: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
5710: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5720: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5730: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
5740: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
5750: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
5760: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
5770: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
5780: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
5790: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
57a0: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
57b0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
57c0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
57d0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
57e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
57f0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
5800: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
5810: 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a  *pFirst, Token *
5820: 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20  pLast){.  Table 
5830: 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  *p;.  int i, j;.
5840: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
5850: 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75  *z, **pz;.  Colu
5860: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
5870: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5880: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5890: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
58a0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
58b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
58c0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
58d0: 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54    pz = &pCol->zT
58e0: 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74  ype;.  n = pLast
58f0: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74  ->n + Addr(pLast
5900: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72  ->z) - Addr(pFir
5910: 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  st->z);.  sqlite
5920: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
5930: 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29  pFirst->z, n, 0)
5940: 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69  ;.  z = *pz;.  i
5950: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
5960: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
5970: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
5980: 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  nt c = z[i];.   
5990: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
59a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
59b0: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
59c0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43    z[j] = 0;.  pC
59d0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
59e0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
59f0: 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  pe(z, n);.}../*.
5a00: 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b  ** The given tok
5a10: 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  en is the defaul
5a20: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
5a30: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
5a40: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
5a50: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
5a60: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
5a70: 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20   If "minusFlag" 
5a80: 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d  is true, it.** m
5a90: 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  eans the value t
5aa0: 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65  oken was precede
5ab0: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
5ac0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
5ad0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5ae0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
5af0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
5b00: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
5b10: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
5b20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
5b30: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
5b40: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
5b50: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
5b60: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
5b70: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
5b80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
5b90: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
5ba0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5bb0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
5bc0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
5bd0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
5be0: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
5bf0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
5c00: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
5c10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
5c20: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d  etNString(pz, "-
5c30: 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  ", 1, pVal->z, p
5c40: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65  Val->n, 0);.  }e
5c50: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5c60: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
5c70: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
5c80: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
5c90: 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  e3Dequote(*pz);.
5ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
5cb0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
5cc0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
5cd0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
5ce0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
5cf0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
5d00: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
5d10: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
5d20: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
5d30: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
5d40: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
5d50: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
5d60: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
5d70: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
5d80: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
5d90: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
5da0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
5db0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
5dc0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
5dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
5de0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
5df0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
5e00: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
5e10: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
5e20: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
5e30: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
5e40: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
5e50: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
5e60: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
5e70: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
5e80: 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65  e row id.  (Exce
5e90: 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61  ption:.** For ba
5ea0: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
5eb0: 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
5ec0: 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e   databases, do n
5ed0: 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66  ot do this.** if
5ee0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
5ef0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
5f00: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29  is less than 1.)
5f10: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
5f20: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
5f30: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
5f40: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
5f50: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
5f60: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
5f70: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
5f80: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
5f90: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
5fa0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
5fb0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5fc0: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
5fd0: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
5fe0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5ff0: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
6000: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
6010: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
6020: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
6030: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
6040: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
6050: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6060: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72  ddPrimaryKey(Par
6070: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6080: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
6090: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
60a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
60b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
60c0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
60d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
60e0: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
60f0: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
6100: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
6110: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
6120: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
6130: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6140: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
6150: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
6160: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
6170: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
6180: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
6190: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
61a0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
61b0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
61c0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
61d0: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
61e0: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
61f0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
6200: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
6210: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
6220: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
6230: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
6240: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
6250: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
6260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6270: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6280: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
6290: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
62a0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
62b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
62c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
62d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
62e0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20  ol<pTab->nCol ) 
62f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
6300: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
6310: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6320: 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69  ist->nExpr>1 ) i
6330: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  Col = -1;.  }.  
6340: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
6350: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
6360: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
6370: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
6380: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
6390: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
63a0: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
63b0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
63c0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
63d0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
63e0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
63f0: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
6400: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
6410: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
6420: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
6430: 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rror, 0, 0);.   
6440: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
6450: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
6460: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
6470: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
6480: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
6490: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
64a0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
64b0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
64c0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
64d0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
64e0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
64f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6500: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
6510: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
6530: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
6540: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64   Table *p;.  Ind
6550: 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c  ex *pIdx;.  Coll
6560: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
6570: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
6580: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6590: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
65a0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
65b0: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
65c0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
65d0: 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  q(pParse, zType,
65e0: 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43   nType);.  p->aC
65f0: 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43  ol[i].pColl = pC
6600: 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  oll;..  /* If th
6610: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
6620: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
6630: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
6640: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a  ATE <type>",.  *
6650: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
6660: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
6670: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
6680: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
6690: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
66a0: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
66b0: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
66c0: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
66d0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d   */.  for(pIdx =
66e0: 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78   p->pIndex; pIdx
66f0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
6700: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
6710: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
6720: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  1 );.    if( pId
6730: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
6740: 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  i ) pIdx->keyInf
6750: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f  o.aColl[0] = pCo
6760: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
6770: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
6780: 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  rn an entry from
6790: 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71   the db.aCollSeq
67a0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
67b0: 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65  the entry.** spe
67c0: 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20  cified by zName 
67d0: 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74  and nName is not
67e0: 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d   found and param
67f0: 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73  eter 'create' is
6800: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63  .** true, then c
6810: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  reate a new entr
6820: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  y. Otherwise ret
6830: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
6840: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f  Each pointer sto
6850: 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
6860: 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  e3.aCollSeq hash
6870: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
6880: 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74  an.** array of t
6890: 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72  hree CollSeq str
68a0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72  uctures. The fir
68b0: 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74  st is the collat
68c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
68d0: 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55  prefferred for U
68e0: 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64  TF-8, the second
68f0: 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74   UTF-16le, and t
6900: 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62  he third UTF-16b
6910: 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20  e..**.** Stored 
6920: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
6930: 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c  r the three coll
6940: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
6950: 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  is a copy of.** 
6960: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
6970: 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70  quence name. A p
6980: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
6990: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
69a0: 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61  in.** each colla
69b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74  tion sequence st
69c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
69d0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e  ic CollSeq * fin
69e0: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20  dCollSeqEntry(. 
69f0: 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 63   sqlite *db,.  c
6a00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6a10: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
6a20: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
6a30: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6a40: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
6a50: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
6a60: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
6a70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
6a80: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
6a90: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
6aa0: 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20  .  if( 0==pColl 
6ab0: 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20  && create ){.   
6ac0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d   pColl = sqliteM
6ad0: 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28  alloc( 3*sizeof(
6ae0: 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20  *pColl) + nName 
6af0: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
6b00: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
6b10: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[0].zName = (
6b20: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
6b30: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e  .      pColl[0].
6b40: 65 6e 63 20 3d 20 54 45 58 54 5f 55 74 66 38 3b  enc = TEXT_Utf8;
6b50: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
6b60: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
6b70: 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20  pColl[3];.      
6b80: 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 54  pColl[1].enc = T
6b90: 45 58 54 5f 55 74 66 31 36 6c 65 3b 0a 20 20 20  EXT_Utf16le;.   
6ba0: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d     pColl[2].zNam
6bb0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
6bc0: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
6bd0: 6c 5b 32 5d 2e 65 6e 63 20 3d 20 54 45 58 54 5f  l[2].enc = TEXT_
6be0: 55 74 66 31 36 62 65 3b 0a 20 20 20 20 20 20 6d  Utf16be;.      m
6bf0: 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a  emcpy(pColl[0].z
6c00: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
6c10: 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  me+1);.      sql
6c20: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
6c30: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43  db->aCollSeq, pC
6c40: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e  oll[0].zName, nN
6c50: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  ame, pColl);.   
6c60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c70: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
6c80: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
6c90: 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d  points to a UTF-
6ca0: 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
6cb0: 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e   nName bytes lon
6cc0: 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  g..** Return the
6cd0: 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65   CollSeq* pointe
6ce0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  r for the collat
6cf0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
6d00: 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20  ed zName.** for 
6d10: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e  the encoding 'en
6d20: 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  c' from the data
6d30: 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a  base 'db'..**.**
6d40: 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70   If the entry sp
6d50: 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66  ecified is not f
6d60: 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65  ound and 'create
6d70: 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ' is true, then 
6d80: 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20  create a.** new 
6d90: 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73  entry.  Otherwis
6da0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
6db0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
6dc0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20  e3FindCollSeq(. 
6dd0: 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 75   sqlite *db,.  u
6de0: 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63  8 enc,.  const c
6df0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
6e00: 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63  t nName,.  int c
6e10: 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53  reate.){.  CollS
6e20: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64  eq *pColl = find
6e30: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c  CollSeqEntry(db,
6e40: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63   zName, nName, c
6e50: 72 65 61 74 65 29 3b 0a 20 20 69 66 28 20 70 43  reate);.  if( pC
6e60: 6f 6c 6c 20 29 20 73 77 69 74 63 68 28 20 65 6e  oll ) switch( en
6e70: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 45  c ){.    case TE
6e80: 58 54 5f 55 74 66 38 3a 0a 20 20 20 20 20 20 62  XT_Utf8:.      b
6e90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6ea0: 45 58 54 5f 55 74 66 31 36 6c 65 3a 0a 20 20 20  EXT_Utf16le:.   
6eb0: 20 20 20 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c     pColl = &pCol
6ec0: 6c 5b 32 5d 3b 0a 20 20 20 20 20 20 62 72 65 61  l[2];.      brea
6ed0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 45 58 54  k;.    case TEXT
6ee0: 5f 55 74 66 31 36 62 65 3a 0a 20 20 20 20 20 20  _Utf16be:.      
6ef0: 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 31  pColl = &pColl[1
6f00: 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ];.      break;.
6f10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20      default: .  
6f20: 20 20 20 20 61 73 73 65 72 74 28 21 22 43 61 6e      assert(!"Can
6f30: 6e 6f 74 20 68 61 70 70 65 6e 22 29 3b 0a 20 20  not happen");.  
6f40: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
6f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6f60: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6f70: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
6f80: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
6f90: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
6fa0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
6fb0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
6fc0: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
6fd0: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
6fe0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
6ff0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
7000: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
7010: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
7020: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
7030: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
7040: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
7050: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
7060: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
7070: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
7080: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
7090: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
70a0: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
70b0: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
70c0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
70d0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
70e0: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
70f0: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
7100: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
7110: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
7120: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
7130: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
7140: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
7150: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
7160: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
7170: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
7180: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7190: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
71a0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
71b0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c   pParse..*/.Coll
71c0: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
71d0: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
71e0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
71f0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
7200: 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63  nName){.  u8 enc
7210: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
7220: 6e 63 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  nc;.  CollSeq *p
7230: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
7240: 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ndCollSeq(pParse
7250: 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  ->db, enc, zName
7260: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , nName, 0);.  i
7270: 66 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  f( !pColl || !pC
7280: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
7290: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
72a0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69   sequence of thi
72b0: 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  s type for this 
72c0: 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69  encoding is regi
72d0: 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43  stered..    ** C
72e0: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
72f0: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
7300: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
7310: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
7320: 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 49     */..    /* FI
7330: 58 20 4d 45 3a 20 41 63 74 75 61 6c 6c 79 20 63  X ME: Actually c
7340: 61 6c 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  all collation fa
7350: 63 74 6f 72 79 2c 20 74 68 65 6e 20 63 61 6c 6c  ctory, then call
7360: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  .    ** sqlite3F
7370: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 20 61 67 61  indCollSeq() aga
7380: 69 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  in.  */.    pCol
7390: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
73a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
73b0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
73c0: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 69  Name, 0);..    i
73d0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f  f( pColl && !pCo
73e0: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
73f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
7400: 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69 6c 65  on factory faile
7410: 64 20 74 6f 20 64 65 6c 69 76 65 72 20 61 20 66  d to deliver a f
7420: 75 6e 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  unction but ther
7430: 65 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 6f  e are.      ** o
7440: 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ther versions of
7450: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
7460: 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74  function (for ot
7470: 68 65 72 20 74 65 78 74 0a 20 20 20 20 20 20 2a  her text.      *
7480: 2a 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61  * encodings) ava
7490: 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 20  ilable. Use one 
74a0: 6f 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64  of these instead
74b0: 2e 20 41 76 6f 69 64 20 61 20 0a 20 20 20 20 20  . Avoid a .     
74c0: 20 2a 2a 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54   ** UTF-8 <-> UT
74d0: 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e 20  F-16 conversion 
74e0: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 20  if possible..   
74f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c     */.      Coll
7500: 53 65 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 30 3b  Seq *pColl2 = 0;
7510: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 65  .      switch( e
7520: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  nc ){.        ca
7530: 73 65 20 54 45 58 54 5f 55 74 66 31 36 6c 65 3a  se TEXT_Utf16le:
7540: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
7550: 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  2 = sqlite3FindC
7560: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
7570: 62 2c 54 45 58 54 5f 55 74 66 31 36 62 65 2c 7a  b,TEXT_Utf16be,z
7580: 4e 61 6d 65 2c 6e 4e 61 6d 65 2c 30 29 3b 0a 20  Name,nName,0);. 
7590: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
75a0: 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20   pColl2 );.     
75b0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d       if( pColl2-
75c0: 3e 78 43 6d 70 20 29 20 62 72 65 61 6b 3b 0a 20  >xCmp ) break;. 
75d0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 32 20           pColl2 
75e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
75f0: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
7600: 54 45 58 54 5f 55 74 66 38 2c 7a 4e 61 6d 65 2c  TEXT_Utf8,zName,
7610: 6e 4e 61 6d 65 2c 30 29 3b 0a 20 20 20 20 20 20  nName,0);.      
7620: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
7630: 6c 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l2 );.          
7640: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
7650: 63 61 73 65 20 54 45 58 54 5f 55 74 66 31 36 62  case TEXT_Utf16b
7660: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  e:.          pCo
7670: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ll2 = sqlite3Fin
7680: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
7690: 3e 64 62 2c 54 45 58 54 5f 55 74 66 31 36 6c 65  >db,TEXT_Utf16le
76a0: 2c 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c 30 29 3b  ,zName,nName,0);
76b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
76c0: 74 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20  t( pColl2 );.   
76d0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
76e0: 32 2d 3e 78 43 6d 70 20 29 20 62 72 65 61 6b 3b  2->xCmp ) break;
76f0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
7700: 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  2 = sqlite3FindC
7710: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
7720: 62 2c 54 45 58 54 5f 55 74 66 38 2c 7a 4e 61 6d  b,TEXT_Utf8,zNam
7730: 65 2c 6e 4e 61 6d 65 2c 30 29 3b 0a 20 20 20 20  e,nName,0);.    
7740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
7750: 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 20 20  oll2 );.        
7760: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
7770: 20 20 63 61 73 65 20 54 45 58 54 5f 55 74 66 38    case TEXT_Utf8
7780: 3a 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  :.          pCol
7790: 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  l2 = sqlite3Find
77a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e  CollSeq(pParse->
77b0: 64 62 2c 54 45 58 54 5f 55 74 66 31 36 62 65 2c  db,TEXT_Utf16be,
77c0: 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c 30 29 3b 0a  zName,nName,0);.
77d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
77e0: 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20  ( pColl2 );.    
77f0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32        if( pColl2
7800: 2d 3e 78 43 6d 70 20 29 20 62 72 65 61 6b 3b 0a  ->xCmp ) break;.
7810: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 32            pColl2
7820: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
7830: 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62  llSeq(pParse->db
7840: 2c 54 45 58 54 5f 55 74 66 31 36 6c 65 2c 7a 4e  ,TEXT_Utf16le,zN
7850: 61 6d 65 2c 6e 4e 61 6d 65 2c 30 29 3b 0a 20 20  ame,nName,0);.  
7860: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7870: 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20  pColl2 );.      
7880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7890: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 43   }..      if( pC
78a0: 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  oll2->xCmp ){.  
78b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
78c0: 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65  ll, pColl2, size
78d0: 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20  of(CollSeq));.  
78e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
78f0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67  .  /* If nothing
7900: 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c   has been found,
7910: 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72   write the error
7920: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50   message into pP
7930: 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21 70  arse */.  if( !p
7940: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
7950: 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
7960: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
7970: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7980: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
7990: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
79a0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
79b0: 73 65 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c  sequence: ", -1,
79c0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  .          zName
79d0: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , nName, 0);.   
79e0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
79f0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65  Err++;.  }..  re
7a00: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
7a10: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
7a20: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
7a30: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
7a40: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
7a50: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
7a60: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
7a70: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
7a80: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7a90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
7aa0: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69   int nType){.  i
7ab0: 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63  nt n, i;.  struc
7ac0: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
7ad0: 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65  ar *zSub;  /* Ke
7ae0: 79 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67  ywords substring
7af0: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
7b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 3b 20  /.    int nSub; 
7b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67           /* leng
7b20: 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20  th of zSub */.  
7b30: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
7b40: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
7b50: 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74   to return if it
7b60: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20   matches */.  } 
7b70: 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b  substrings[] = {
7b80: 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c  .    {"INT",  3,
7b90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7ba0: 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52  GER},.    {"CHAR
7bb0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
7bc0: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c  _TEXT},.    {"CL
7bd0: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
7be0: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
7bf0: 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45  TEXT", 4, SQLITE
7c00: 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20  _AFF_TEXT},.    
7c10: 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49  {"BLOB", 4, SQLI
7c20: 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20  TE_AFF_NONE},.  
7c30: 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d  };..  if( nType=
7c40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7c50: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7c60: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
7c70: 20 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72   i<sizeof(substr
7c80: 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62  ings)/sizeof(sub
7c90: 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b  strings[0]); i++
7ca0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20  ){.    int c1 = 
7cb0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53  substrings[i].zS
7cc0: 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63  ub[0];.    int c
7cd0: 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b  2 = tolower(c1);
7ce0: 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
7cf0: 20 6e 54 79 70 65 20 2d 20 73 75 62 73 74 72 69   nType - substri
7d00: 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20  ngs[i].nSub;.   
7d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
7d20: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a   substrings[i].z
7d30: 53 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Sub;.    for(n=0
7d40: 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29  ; n<=limit; n++)
7d50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20  {.      int c = 
7d60: 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20  zType[n];.      
7d70: 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d  if( (c==c1 || c=
7d80: 3d 63 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  =c2).           
7d90: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
7da0: 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e  trNICmp(&zType[n
7db0: 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73  ], z, substrings
7dc0: 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20  [i].nSub) ){.   
7dd0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 73       return subs
7de0: 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69  trings[i].affini
7df0: 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ty;.      }.    
7e00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
7e10: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7e20: 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65  C;.}../*.** Come
7e30: 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72   up with a new r
7e40: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20  andom value for 
7e50: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
7e60: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a  e.  Make sure.**
7e70: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
7e80: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
7e90: 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20   the old..**.** 
7ea0: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
7eb0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
7ec0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
7ed0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
7ee0: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
7ef0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
7f00: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
7f10: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
7f20: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
7f30: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
7f40: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
7f50: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
7f60: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
7f70: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
7f80: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
7f90: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
7fa0: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
7fb0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
7fc0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
7fd0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
7fe0: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
7ff0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
8000: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
8010: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
8020: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
8030: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
8040: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
8050: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
8060: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
8070: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
8080: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
8090: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
80a0: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
80b0: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
80c0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
80d0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
80e0: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
80f0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
8100: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
8110: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
8120: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
8130: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
8140: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20  geCookie(sqlite 
8150: 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e  *db, Vdbe *v, in
8160: 74 20 69 44 62 29 7b 0a 20 20 75 6e 73 69 67 6e  t iDb){.  unsign
8170: 65 64 20 63 68 61 72 20 72 3b 0a 20 20 69 6e 74  ed char r;.  int
8180: 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20   *pSchemaCookie 
8190: 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  = &(db->aDb[iDb]
81a0: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b  .schema_cookie);
81b0: 0a 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f  ..  sqlite3Rando
81c0: 6d 6e 65 73 73 28 31 2c 20 26 72 29 3b 0a 20 20  mness(1, &r);.  
81d0: 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d  *pSchemaCookie =
81e0: 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20   *pSchemaCookie 
81f0: 2b 20 72 20 2b 20 31 3b 0a 20 20 64 62 2d 3e 66  + r + 1;.  db->f
8200: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
8210: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
8220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8230: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8240: 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 2c 20  *pSchemaCookie, 
8250: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
8260: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
8270: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
8290: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
82a0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
82b0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
82c0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
82d0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
82e0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
82f0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
8300: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
8310: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
8320: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
8330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
8340: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
8350: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
8360: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
8370: 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d  te = 0;.  for(n=
8380: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
8390: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c  {.    if( *z=='\
83a0: 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51  '' ){ n++; needQ
83b0: 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20  uote=1; }.  }.  
83c0: 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51  return n + needQ
83d0: 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uote*2;.}../*.**
83e0: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
83f0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
8400: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
8410: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
8420: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
8430: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
8440: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
8450: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
8460: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64  *pIdx, char *zId
8470: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ent){.  int i, j
8480: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
8490: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
84a0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
84b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
84c0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
84d0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
84e0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
84f0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
8500: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
8510: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
8520: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
8530: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
8540: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
8550: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
8560: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
8570: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
8580: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
8590: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
85a0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
85b0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
85c0: 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69  t[j]=='\'' ) z[i
85d0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a  ++] = '\'';.  }.
85e0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
85f0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
8600: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
8610: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
8620: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
8630: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8640: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
8650: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
8660: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
8670: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
8680: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
8690: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
86a0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
86b0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
86c0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
86d0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
86e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
86f0: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
8700: 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  (Table *p){.  in
8710: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
8720: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
8730: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
8740: 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *zEnd;.  n = 0;.
8750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8760: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8770: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
8780: 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  (p->aCol[i].zNam
8790: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  e);.    if( p->a
87a0: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a  Col[i].zType ){.
87b0: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
87c0: 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  en(p->aCol[i].zT
87d0: 79 70 65 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  ype) + 1);.    }
87e0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
87f0: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
8800: 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b  );.  if( n<40 ){
8810: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
8820: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
8830: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
8840: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
8850: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
8860: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
8870: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
8880: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
8890: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
88a0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
88b0: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
88c0: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
88d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
88e0: 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62  py(zStmt, p->iDb
88f0: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
8900: 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52  MP TABLE " : "CR
8910: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
8920: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d   k = strlen(zStm
8930: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
8940: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
8950: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
8960: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69  ] = '(';.  for(i
8970: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8980: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
8990: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
89a0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
89b0: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
89c0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
89d0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
89e0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b  mt, &k, p->aCol[
89f0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  i].zName);.    i
8a00: 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  f( p->aCol[i].zT
8a10: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ype ){.      zSt
8a20: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
8a30: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74       strcpy(&zSt
8a40: 6d 74 5b 6b 5d 2c 20 70 2d 3e 61 43 6f 6c 5b 69  mt[k], p->aCol[i
8a50: 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ].zType);.      
8a60: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 61  k += strlen(p->a
8a70: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20  Col[i].zType);. 
8a80: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70     }.  }.  strcp
8a90: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
8aa0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
8ab0: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
8ac0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8ad0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
8ae0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
8af0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
8b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8b10: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
8b20: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
8b30: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
8b40: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
8b50: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
8b60: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
8b70: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
8b80: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
8b90: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
8ba0: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
8bb0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
8bc0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
8bd0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
8be0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
8bf0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
8c00: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
8c10: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
8c20: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
8c30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
8c40: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
8c50: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
8c60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
8c70: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
8c80: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
8c90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8ca0: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
8cb0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
8cc0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
8cd0: 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20  tly changes, so 
8ce0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
8cf0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
8d00: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
8d10: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
8d20: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
8d30: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
8d40: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
8d50: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
8d60: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
8d70: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
8d80: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
8d90: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
8da0: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
8db0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
8dc0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
8dd0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
8de0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
8df0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
8e00: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
8e10: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
8e20: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
8e30: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
8e40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8e50: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
8e60: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
8e70: 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  End, Select *pSe
8e80: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
8e90: 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  p;.  sqlite *db 
8ea0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
8eb0: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
8ec0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
8ed0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
8ee0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
8ef0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8f00: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
8f10: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
8f20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
8f30: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
8f40: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
8f50: 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ect );..  /* If 
8f60: 74 68 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e  the table is gen
8f70: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45  erated from a SE
8f80: 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74  LECT, then const
8f90: 72 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69  ruct the.  ** li
8fa0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e  st of columns an
8fb0: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
8fc0: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e table..  */.  
8fd0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
8fe0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
8ff0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
9000: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
9010: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
9020: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
9030: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
9040: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
9050: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
9060: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
9070: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
9080: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
9090: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
90a0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
90b0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
90c0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
90d0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
90e0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
90f0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
9100: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
9110: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
9120: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
9130: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
9140: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
9150: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
9160: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
9170: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
9180: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
9190: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
91a0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
91b0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
91c0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
91d0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
91e0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
91f0: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
9200: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
9210: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
9220: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
9230: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
9240: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
9250: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
9260: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
9270: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
9280: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
9290: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
92a0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
92b0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
92c0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
92d0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
92e0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
92f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9300: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
9310: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
9320: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  ;..    if( p->pS
9330: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
9340: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
9350: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  able */.      sq
9360: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
9370: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
9380: 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68 61 72  0, p->iDb, (char
9390: 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  *)&p->tnum, P3_P
93a0: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c  OINTER);.    }el
93b0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
93c0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
93d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
93e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
93f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
9400: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20  >tnum = 0;..    
9410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9420: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
9430: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   0);..    /* If 
9440: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
9450: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
9460: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
9470: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
9480: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
9490: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
94a0: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
94b0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
94c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
94d0: 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20  table is on the 
94e0: 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20  top of the vdbe 
94f0: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20  stack..    **.  
9500: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
9510: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
9520: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
9530: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
9540: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
9550: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
9560: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
9570: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
9580: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
9590: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
95a0: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
95b0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
95c0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
95d0: 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tab;.      sqlit
95e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
95f0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
9600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9610: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
9620: 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  er, p->iDb, 0);.
9630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9640: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
9650: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
9660: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
9670: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
9680: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
9690: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
96a0: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
96b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
96c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
96d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
96e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
96f0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
9700: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
9710: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
9720: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
9730: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
9740: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
9750: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
9760: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9770: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
9780: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
9790: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
97a0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
97b0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
97c0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
97d0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
97e0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
97f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
9800: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
9810: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
9820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
9830: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
9840: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 2d 3e  sterTable(v, p->
9850: 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  iDb);..    sqlit
9860: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
9870: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
9880: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61  ->pSelect==0?"ta
9890: 62 6c 65 22 3a 22 76 69 65 77 22 2c 50 33 5f 53  ble":"view",P3_S
98a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
98b0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
98c0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
98d0: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
98e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
98f0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
9900: 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  0, 0, p->zName, 
9910: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
9920: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
9930: 75 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20 20 20  ull, 3, 0);..   
9940: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
9950: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
9960: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
9970: 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20  p);.      n = z 
9980: 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b  ? strlen(z) : 0;
9990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
99a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
99b0: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
99c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
99d0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
99e0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
99f0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  teFree(z);.    }
9a00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
9a10: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
9a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9a30: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
9a40: 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54  g8, 0, 0, "CREAT
9a50: 45 20 56 49 45 57 20 22 2c 20 50 33 5f 53 54 41  E VIEW ", P3_STA
9a60: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TIC);.      }els
9a70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9a80: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
9a90: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22  String8, 0, 0, "
9aa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 2c 20  CREATE TABLE ", 
9ab0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
9ac0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
9ad0: 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  ( pEnd!=0 );.   
9ae0: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
9af0: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72  ->z) - Addr(pPar
9b00: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
9b10: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
9b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9b30: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
9b40: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9b50: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
9b60: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61   -1, pParse->sNa
9b70: 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  meToken.z, n);. 
9b80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63  AddOp(v, OP_Conc
9ba0: 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d  at, 2, 0);.    }
9bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9bc0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9bd0: 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74  cord, 5, 0, "ttt
9be0: 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  it", P3_STATIC);
9bf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9c00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
9c10: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
9c20: 20 20 69 66 28 20 70 2d 3e 69 44 62 21 3d 31 20    if( p->iDb!=1 
9c30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9c40: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
9c50: 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20   v, p->iDb);.   
9c60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
9c70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
9c80: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  ose, 0, 0);..   
9c90: 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
9ca0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
9cb0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
9cc0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
9cd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
9ce0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9cf0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
9d00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
9d10: 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61  xplain==0 && pPa
9d20: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
9d30: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
9d40: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
9d50: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
9d60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
9d70: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
9d80: 74 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20  tblHash, .      
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20        p->zName, 
9db0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
9dc0: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
9dd0: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
9de0: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
9df0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
9e00: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
9e10: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
9e20: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
9e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
9e40: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
9e50: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
9e60: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
9e70: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
9e80: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
9e90: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
9ea0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
9eb0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
9ec0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
9ed0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
9ee0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
9ef0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
9f00: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
9f10: 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ].aFKey, pFKey->
9f20: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
9f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
9f40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
9f50: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
9f60: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
9f70: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
9f80: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
9f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  }../*.** The par
9fa0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
9fb0: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
9fc0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
9fd0: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
9fe0: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
9ff0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a000: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
a010: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a020: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
a030: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
a040: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
a050: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
a060: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
a070: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
a080: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
a090: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
a0a0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
a0b0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
a0c0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
a0d0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
a0e0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
a0f0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a100: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
a110: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
a120: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
a130: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
a140: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
a150: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
a160: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
a170: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
a180: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
a190: 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
a1a0: 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
a1b0: 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
a1c0: 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65  pName;..  sqlite
a1d0: 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
a1e0: 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d  se, pBegin, pNam
a1f0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
a200: 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50  mp, 1);.  p = pP
a210: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a220: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
a230: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
a240: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
a250: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
a260: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
a270: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
a280: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
a290: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
a2a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
a2b0: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
a2c0: 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44  x, pParse, p->iD
a2d0: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
a2e0: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
a2f0: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
a300: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
a310: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
a320: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
a330: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
a340: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
a350: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
a360: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a370: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
a380: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
a390: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
a3a0: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
a3b0: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
a3c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
a3d0: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
a3e0: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
a3f0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
a400: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
a410: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
a420: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
a430: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
a440: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
a450: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
a460: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
a470: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
a480: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
a490: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
a4a0: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21  Select);.  if( !
a4b0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
a4c0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
a4d0: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
a4e0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
a4f0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
a500: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
a510: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
a520: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
a530: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
a540: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
a550: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
a560: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
a570: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
a580: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
a590: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
a5a0: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
a5b0: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
a5c0: 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a  n = ((int)sEnd.z
a5d0: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
a5e0: 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  >z;.  z = pBegin
a5f0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
a600: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
a610: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
a620: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
a630: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
a640: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
a650: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
a660: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
a670: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
a680: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
a690: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
a6a0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
a6b0: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
a6c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
a6d0: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
a6e0: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
a6f0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
a700: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
a710: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
a720: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
a730: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
a740: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
a750: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
a760: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
a770: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
a780: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
a790: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
a7a0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
a7b0: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
a7c0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
a7d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
a7e0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78  e *pTable){.  Ex
a7f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a800: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
a810: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
a820: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
a830: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
a840: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
a850: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
a860: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
a870: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
a880: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
a890: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
a8a0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
a8b0: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
a8c0: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
a8d0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
a8e0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
a8f0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
a900: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
a910: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
a920: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
a930: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
a940: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
a950: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
a960: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
a970: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
a980: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
a990: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
a9a0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
a9b0: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
a9c0: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
a9d0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
a9e0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
a9f0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
aa00: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
aa10: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
aa20: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
aa30: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
aa40: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
aa50: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
aa60: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
aa70: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
aa80: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
aa90: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
aaa0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
aab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
aac0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
aad0: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
aae0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
aaf0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
ab00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
ab10: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
ab20: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
ab30: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
ab40: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
ab50: 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  names..  */.  as
ab60: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
ab70: 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e  elect ); /* If n
ab80: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61  Col==0, then pTa
ab90: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49  ble must be a VI
aba0: 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70  EW */.  pSel = p
abb0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a  Table->pSelect;.
abc0: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
abd0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
abe0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
abf0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
ac00: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
ac10: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  elements in this
ac20: 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65 20 77   list.  But we w
ac30: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74  ill need to rest
ac40: 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a  ore the list.  *
ac50: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  * back to its or
ac60: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
ac70: 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c  tion afterwards,
ac80: 20 73 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f   so we save a co
ac90: 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f  py of.  ** the o
aca0: 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73  riginal in pELis
acb0: 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74  t..  */.  pEList
acc0: 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b   = pSel->pEList;
acd0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
ace0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
acf0: 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20  tDup(pEList);.  
ad00: 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  if( pSel->pEList
ad10: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d  ==0 ){.    pSel-
ad20: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
ad30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  ;.    return 1; 
ad40: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
ad50: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c  d */.  }.  pTabl
ad60: 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
ad70: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
ad80: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
ad90: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
ada0: 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54  el);.  if( pSelT
adb0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
adc0: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
add0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 );.    pTable-
ade0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
adf0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c  >nCol;.    pTabl
ae00: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
ae10: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65  b->aCol;.    pSe
ae20: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
ae30: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
ae40: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
ae50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
ae60: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44   pSelTab);.    D
ae70: 62 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61  bSetProperty(pPa
ae80: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d  rse->db, pTable-
ae90: 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74  >iDb, DB_Unreset
aea0: 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Views);.  }else{
aeb0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
aec0: 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b  l = 0;.    nErr+
aed0: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
aee0: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65  SelectUnbind(pSe
aef0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
af00: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
af10: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65  ->pEList);.  pSe
af20: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
af30: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  st;.  return nEr
af40: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  r;  .}../*.** Cl
af50: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
af60: 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49  ames from the VI
af70: 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  EW pTable..**.**
af80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
af90: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
afa0: 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65   any other table
afb0: 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69   or view is modi
afc0: 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65  fied..** The vie
afd0: 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  w passed into th
afe0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
aff0: 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79   depend directly
b000: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a   or indirectly.*
b010: 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  * on the modifie
b020: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62  d or deleted tab
b030: 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  le so we need to
b040: 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63   clear the old c
b050: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73  olumn.** names s
b060: 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
b070: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a   be recomputed..
b080: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
b090: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
b0a0: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
b0b0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
b0c0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
b0d0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
b0e0: 62 6c 65 21 3d 30 20 26 26 20 70 54 61 62 6c 65  ble!=0 && pTable
b0f0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
b100: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
b110: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c  pTable->aCol; i<
b120: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
b130: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b140: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
b150: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
b160: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44  iteFree(pCol->zD
b170: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
b180: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
b190: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
b1a0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
b1b0: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
b1c0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
b1d0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
b1e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
b1f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
b200: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
b210: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
b220: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
b230: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
b240: 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64  lite *db, int id
b250: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
b260: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
b270: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
b280: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
b290: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
b2a0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
b2b0: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
b2c0: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
b2d0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
b2e0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
b2f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
b300: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
b310: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
b320: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
b330: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
b340: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
b350: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
b360: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
b370: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
b380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
b390: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
b3a0: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
b3b0: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
b3c0: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
b3d0: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
b3e0: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
b3f0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
b400: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
b410: 69 74 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  ite3TableFromTok
b420: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
b430: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  , Token *pTok){.
b440: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
b450: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b460: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54  zName = sqlite3T
b470: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
b480: 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a  n(pTok);.  if( z
b490: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
b4a0: 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   0;.  pTab = sql
b4b0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
b4c0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
b4d0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
b4e0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
b4f0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
b500: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b510: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
b520: 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b  table: %T", pTok
b530: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  );.    pParse->c
b540: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
b550: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
b560: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
b570: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b580: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
b590: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
b5a0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
b5b0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
b5c0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
b5d0: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
b5e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
b5f0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
b600: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
b610: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
b620: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
b630: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
b640: 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  nt base;.  sqlit
b650: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
b660: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
b670: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
b680: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
b690: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
b6a0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
b6b0: 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  le;.  assert( pN
b6c0: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
b6d0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
b6e0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
b6f0: 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
b700: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
b710: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a  0].zDatabase);..
b720: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
b730: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
b740: 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54  able;.  iDb = pT
b750: 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72  ab->iDb;.  asser
b760: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
b770: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e  <db->nDb );.#ifn
b780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b790: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
b7a0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
b7b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b7c0: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
b7d0: 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a  BLE(pTab->iDb);.
b7e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b7f0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54  zDb = db->aDb[pT
b800: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ab->iDb].zName;.
b810: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
b820: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
b830: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
b840: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
b850: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
b860: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
b870: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
b880: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44   ){.      if( iD
b890: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
b8a0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
b8b0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
b8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b8d0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
b8e0: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
b8f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b900: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
b910: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
b920: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
b930: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
b940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
b950: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
b960: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
b970: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
b980: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
b990: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
b9a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
b9b0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
b9c0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
b9d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b9e0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
b9f0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
ba00: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
ba10: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
ba20: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
ba30: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
ba40: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
ba50: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
ba60: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ba70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ba80: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
ba90: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
baa0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
bab0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
bac0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
bad0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
bae0: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
baf0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
bb00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bb10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bb20: 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
bb30: 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
bb40: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
bb50: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
bb60: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
bb70: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
bb80: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
bb90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bba0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bbb0: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
bbc0: 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
bbd0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
bbe0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
bbf0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  op_table;.  }.. 
bc00: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
bc10: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
bc20: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
bc30: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
bc40: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
bc50: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
bc60: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
bc70: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
bc80: 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72  ic VdbeOpList dr
bc90: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
bca0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
bcb0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 33 29       0, ADDR(13)
bcc0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
bcd0: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
bce0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
bcf0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
bd00: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
bd10: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
bd20: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
bd30: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
bd40: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
bd50: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
bd60: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
bd70: 20 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f    0}, /* sqlite_
bd80: 6d 61 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65 20  master.tbl_name 
bd90: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  */.      { OP_Ne
bda0: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
bdb0: 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20  R(12), 0},.     
bdc0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
bdd0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
bde0: 74 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20 20  trigger"},.     
bdf0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
be00: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
be10: 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  }, /* sqlite_mas
be20: 74 65 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20 20  ter.type */.    
be30: 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20    { OP_Eq,      
be40: 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20     0, ADDR(12), 
be50: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
be60: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
be70: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
be80: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
be90: 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20     0, ADDR(13), 
bea0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
beb0: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
bec0: 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(3),  0},.    
bed0: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
bee0: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20     0, ADDR(3),  
bef0: 30 7d 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20  0}, /* 12 */.   
bf00: 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   };.    Index *p
bf10: 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72  Idx;.    Trigger
bf20: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
bf30: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
bf40: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
bf50: 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29  e, 0, pTab->iDb)
bf60: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  ;..    /* Drop a
bf70: 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
bf80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
bf90: 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
bfa0: 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a  ped. Code.    **
bfb0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
bfc0: 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
bfd0: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
bfe0: 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a  er and/or.    **
bff0: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
c000: 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e  ter if required.
c010: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69  .    */.    pTri
c020: 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72  gger = pTab->pTr
c030: 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65  igger;.    while
c040: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
c050: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
c060: 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d  gger->iDb==pTab-
c070: 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72  >iDb || pTrigger
c080: 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ->iDb==1 );.    
c090: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
c0a0: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
c0b0: 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20  pTrigger, 1);.  
c0c0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
c0d0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
c0e0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
c0f0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
c100: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c110: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
c120: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
c130: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c140: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
c150: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
c160: 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
c170: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
c180: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
c190: 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
c1a0: 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
c1b0: 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
c1c0: 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
c1d0: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
c1e0: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
c1f0: 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
c200: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
c210: 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
c220: 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
c230: 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
c240: 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
c250: 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
c260: 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
c270: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
c280: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
c290: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
c2a0: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
c2b0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
c2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
c2d0: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
c2e0: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  Tab->iDb);.    b
c2f0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
c300: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
c310: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
c320: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
c330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
c340: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
c350: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
c360: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  0);.    sqlite3C
c370: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
c380: 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  v, pTab->iDb);. 
c390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c3a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
c3b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
c3c0: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
c3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3e0: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
c3f0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61   pTab->tnum, pTa
c400: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66  b->iDb);.      f
c410: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
c420: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c430: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
c440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c450: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
c460: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
c470: 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20  m, pIdx->iDb);. 
c480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c490: 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
c4a0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
c4b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
c4c0: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
c4d0: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
c4e0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a   the table..  **
c4f0: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
c500: 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   if the SQL stat
c510: 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68  ement began with
c520: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
c530: 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  word,.  ** then 
c540: 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c  no changes shoul
c550: 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  d be made..  */.
c560: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
c570: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
c580: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
c590: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
c5a0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  b);.    db->flag
c5b0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
c5c0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20  rnChanges;.  }. 
c5d0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
c5e0: 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65  All(db, iDb);..e
c5f0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
c600: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
c610: 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
c620: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c630: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
c640: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
c650: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
c660: 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
c670: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
c680: 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
c690: 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
c6a0: 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
c6b0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
c6c0: 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
c6d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
c6e0: 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
c6f0: 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
c700: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
c710: 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
c720: 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
c730: 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
c740: 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
c750: 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
c760: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
c770: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
c780: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
c790: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
c7a0: 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
c7b0: 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
c7c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
c7d0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
c7e0: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
c7f0: 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
c800: 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
c810: 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
c820: 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
c830: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
c840: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
c850: 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
c860: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
c870: 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
c880: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
c890: 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
c8a0: 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
c8b0: 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
c8c0: 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
c8d0: 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
c8e0: 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
c8f0: 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
c900: 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
c910: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
c920: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
c930: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
c940: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
c950: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
c960: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
c970: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
c980: 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
c990: 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
c9a0: 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
c9b0: 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
c9c0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
c9d0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
c9e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c9f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
ca00: 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
ca10: 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
ca20: 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
ca30: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
ca40: 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
ca50: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ca60: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
ca70: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
ca80: 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
ca90: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
caa0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
cab0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
cac0: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
cad0: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
cae0: 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61  thms. */.){.  Ta
caf0: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
cb00: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
cb10: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
cb20: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
cb30: 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20  char *z;.  FKey 
cb40: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61  *pFKey = 0;..  a
cb50: 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
cb60: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
cb70: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
cb80: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
cb90: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
cba0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
cbb0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
cbc0: 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
cbd0: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
cbe0: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
cbf0: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
cc00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
cc10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
cc20: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
cc30: 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
cc40: 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
cc50: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
cc60: 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
cc70: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
cc80: 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
cc90: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
cca0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
ccb0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
ccc0: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
ccd0: 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
cce0: 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
ccf0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cd00: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
cd10: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
cd20: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
cd30: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
cd40: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
cd50: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
cd60: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
cd70: 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
cd80: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
cd90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
cda0: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
cdb0: 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
cdc0: 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
cdd0: 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
cde0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
cdf0: 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
ce00: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
ce10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
ce20: 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
ce30: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
ce40: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
ce50: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
ce60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
ce70: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
ce80: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
ce90: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
cea0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
ceb0: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
cec0: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
ced0: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
cee0: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
cef0: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
cf00: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
cf10: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
cf20: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
cf30: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
cf40: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
cf50: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
cf60: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
cf70: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
cf80: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
cf90: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
cfa0: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
cfb0: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
cfc0: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
cfd0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
cfe0: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
cff0: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
d000: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
d010: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d020: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
d030: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
d040: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
d060: 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
d070: 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
d080: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
d090: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
d0a0: 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
d0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
d0c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d0d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
d0e0: 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
d0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
d100: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
d110: 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
d120: 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
d130: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
d140: 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
d150: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
d160: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
d170: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
d180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d190: 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
d1a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
d1b0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
d1c0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
d1d0: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
d1e0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
d1f0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
d200: 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
d210: 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
d220: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
d230: 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
d240: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
d250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
d260: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
d270: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65  0;.  pFKey->dele
d280: 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26  teConf = flags &
d290: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
d2a0: 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c  updateConf = (fl
d2b0: 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
d2c0: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65  f;.  pFKey->inse
d2d0: 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  rtConf = (flags 
d2e0: 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a  >> 16 ) & 0xff;.
d2f0: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
d300: 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
d310: 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
d320: 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
d330: 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
d340: 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
d350: 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
d360: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
d370: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d380: 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b  elete(pFromCol);
d390: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
d3a0: 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
d3b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d3c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d3d0: 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
d3e0: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
d3f0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
d400: 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
d410: 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
d420: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
d430: 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
d440: 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
d450: 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
d460: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
d470: 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
d480: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
d490: 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
d4a0: 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
d4b0: 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
d4c0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
d4d0: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
d4e0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
d4f0: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
d500: 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
d510: 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
d520: 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rred){.  Table *
d530: 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
d540: 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
d550: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
d560: 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
d570: 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
d580: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
d590: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
d5a0: 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
d5b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
d5c0: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
d5d0: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
d5e0: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
d5f0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
d600: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
d610: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d620: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
d630: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
d640: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
d650: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
d660: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
d670: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
d680: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
d690: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
d6a0: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
d6b0: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
d6c0: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
d6d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
d6e0: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
d6f0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
d700: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
d710: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
d720: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
d730: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
d740: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
d750: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
d760: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
d770: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
d780: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
d790: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
d7a0: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
d7b0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
d7c0: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
d7d0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
d7e0: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
d7f0: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
d800: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
d810: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
d820: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
d830: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
d840: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d850: 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
d860: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
d870: 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
d880: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
d890: 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
d8a0: 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
d8b0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
d8c0: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
d8d0: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
d8e0: 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
d8f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
d900: 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a  t *pTblName,  /*
d910: 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
d920: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
d930: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
d940: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d950: 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
d960: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
d970: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
d980: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  onError,     /* 
d990: 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
d9a0: 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
d9b0: 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
d9c0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
d9d0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
d9e0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
d9f0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
da00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
da10: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
da20: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
da30: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
da40: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
da50: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
da60: 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54   *pTab = 0; /* T
da70: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
da80: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
da90: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
daa0: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
dab0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
dac0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
dad0: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
dae0: 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
daf0: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
db00: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
db10: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
db20: 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
db30: 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
db40: 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
db50: 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
db60: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
db70: 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
db80: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
db90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
dba0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
dbb0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
dbc0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
dbd0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
dbe0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
dbf0: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75  ame = 0; /* Unqu
dc00: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
dc10: 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
dc20: 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ate */..  if( pP
dc30: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
dc40: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
dc50: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
dc60: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
dc70: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
dc80: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
dc90: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
dca0: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
dcb0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
dcc0: 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
dcd0: 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
dce0: 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
dcf0: 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
dd00: 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
dd10: 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
dd20: 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
dd30: 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
dd40: 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
dd50: 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
dd60: 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
dd70: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
dd80: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
dd90: 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
dda0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
ddb0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
ddc0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
ddd0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
dde0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
ddf0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
de00: 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  dex;..    /* If 
de10: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
de20: 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
de30: 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65  check if the the
de40: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
de50: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
de60: 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
de70: 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20  tabase to 1..   
de80: 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73   */.    pTab = s
de90: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
dea0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
deb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
dec0: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
ded0: 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
dee0: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b   pTab->iDb==1 ){
def0: 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a  .      iDb = 1;.
df00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
df10: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
df20: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
df30: 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
df40: 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
df50: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
df60: 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
df70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
df80: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
df90: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
dfa0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
dfb0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
dfc0: 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
dfd0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
dfe0: 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
dff0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69  Database);.    i
e000: 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
e010: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e020: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  x;.    assert( i
e030: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
e040: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
e050: 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
e060: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
e070: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
e080: 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d  .    iDb = pTab-
e090: 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  >iDb;.  }..  if(
e0a0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
e0b0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
e0c0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e0d0: 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
e0e0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
e0f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e100: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
e110: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
e120: 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
e130: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
e140: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
e150: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
e160: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
e170: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e180: 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
e190: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
e1a0: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
e1b0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
e1c0: 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70    }.  isTemp = p
e1d0: 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20  Tab->iDb==1;..  
e1e0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
e1f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
e200: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
e210: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
e220: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
e230: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
e240: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
e250: 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
e260: 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
e270: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
e280: 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
e290: 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
e2a0: 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
e2b0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
e2c0: 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
e2d0: 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
e2e0: 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
e2f0: 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
e300: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
e310: 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
e320: 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
e330: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
e340: 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
e350: 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
e360: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
e370: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
e380: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
e390: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
e3a0: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
e3b0: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
e3c0: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
e3d0: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
e3e0: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
e3f0: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
e400: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26  */.  if( pName &
e410: 26 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  & !db->init.busy
e420: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
e430: 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  ISameName;    /*
e440: 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77   Another index w
e450: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
e460: 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  e */.    Table *
e470: 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pTSameName;    /
e480: 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73  * A table with s
e490: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
e4a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61  index */.    zNa
e4b0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
e4c0: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
e4d0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
e4e0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
e4f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e500: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
e510: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
e520: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
e530: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
e540: 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  ].zName))!=0 ){.
e550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e560: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
e570: 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
e580: 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
e590: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
e5a0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
e5b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54     }.    if( (pT
e5c0: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
e5d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
e5e0: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
e5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
e600: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e610: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
e620: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25   a table named %
e630: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
e640: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
e650: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
e660: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
e670: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  e==0 ){.    char
e680: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69   zBuf[30];.    i
e690: 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
e6a0: 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
e6b0: 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
e6c0: 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
e6d0: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
e6e0: 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73  xt, n++){}.    s
e6f0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29  printf(zBuf,"%d)
e700: 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  ",n);.    zName 
e710: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
e720: 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
e730: 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  , "(", pTab->zNa
e740: 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20  me, " autoindex 
e750: 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  ", zBuf, (char*)
e760: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
e770: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
e780: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
e790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
e7a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
e7b0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
e7c0: 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e->n);.  }..  /*
e7d0: 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
e7e0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
e7f0: 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
e800: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e810: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
e820: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
e830: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
e840: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
e850: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
e860: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e870: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e880: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
e890: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
e8a0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
e8b0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
e8c0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
e8d0: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
e8e0: 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
e8f0: 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53  ( isTemp ) i = S
e900: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
e910: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
e920: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
e930: 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
e940: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
e950: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
e960: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
e970: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
e980: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
e990: 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
e9a0: 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
e9b0: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
e9c0: 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
e9d0: 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
e9e0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
e9f0: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
ea00: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
ea10: 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
ea20: 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
ea30: 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
ea40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
ea50: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
ea60: 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43  lId.z = pTab->aC
ea70: 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
ea80: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
ea90: 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75  Id.n = strlen(nu
eaa0: 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69  llId.z);.    pLi
eab0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
eac0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c  ListAppend(0, 0,
ead0: 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
eae0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
eaf0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
eb00: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
eb10: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
eb20: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
eb30: 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64  re. .  */.  pInd
eb40: 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
eb50: 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  c( sizeof(Index)
eb60: 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   + strlen(zName)
eb70: 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20   + 1 +.         
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
eb90: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69  sizeof(int) + si
eba0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a  zeof(CollSeq*))*
ebb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  pList->nExpr );.
ebc0: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
ebd0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
ebe0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
ebf0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
ec00: 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  int*)&pIndex->ke
ec10: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73  yInfo.aColl[pLis
ec20: 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e  t->nExpr];.  pIn
ec30: 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
ec40: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ar*)&pIndex->aiC
ec50: 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78  olumn[pList->nEx
ec60: 70 72 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49  pr];.  strcpy(pI
ec70: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
ec80: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  me);.  pIndex->p
ec90: 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
eca0: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
ecb0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
ecc0: 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
ecd0: 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  r = onError;.  p
ece0: 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
ecf0: 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70   = pName==0;.  p
ed00: 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62  Index->iDb = iDb
ed10: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
ed20: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
ed30: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
ed40: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
ed50: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
ed60: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
ed70: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
ed80: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
ed90: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
eda0: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
edb0: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
edc0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
edd0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
ede0: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
edf0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
ee00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
ee10: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
ee20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
ee30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
ee40: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
ee50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ee60: 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
ee70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
ee80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ee90: 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
eea0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
eeb0: 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
eec0: 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  zName, pList->a[
eed0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
eee0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
eef0: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
ef00: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ef10: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
ef20: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
ef30: 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c   = j;.    if( pL
ef40: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
ef50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
ef60: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
ef70: 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
ef80: 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e     pIndex->keyIn
ef90: 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c  fo.aColl[i] = pL
efa0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
efb0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  >pColl;.    }els
efc0: 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e{.      pIndex-
efd0: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
efe0: 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  ] = pTab->aCol[j
eff0: 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].pColl;.    }. 
f000: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
f010: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
f020: 5b 69 5d 20 29 3b 0a 20 20 7d 0a 20 20 70 49 6e  [i] );.  }.  pIn
f030: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
f040: 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
f050: 70 72 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  pr;..  /* Link t
f060: 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
f070: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
f080: 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
f090: 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
f0a0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
f0b0: 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
f0c0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
f0d0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64  plain ){.    Ind
f0e0: 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
f0f0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
f100: 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  (&db->aDb[pIndex
f110: 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  ->iDb].idxHash, 
f120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f130: 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
f140: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
f150: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31  pIndex->zName)+1
f160: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
f170: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
f180: 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
f190: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
f1a0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
f1b0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
f1c0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
f1d0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
f1e0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
f1f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
f200: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
f210: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
f220: 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
f230: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
f240: 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
f250: 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
f260: 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
f270: 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
f280: 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
f290: 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
f2a0: 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
f2b0: 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
f2c0: 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
f2d0: 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
f2e0: 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
f2f0: 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
f300: 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21  /.  if( onError!
f310: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
f320: 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
f330: 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
f340: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
f350: 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
f360: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
f370: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
f380: 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
f390: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  = pIndex;.  }els
f3a0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  e{.    Index *pO
f3b0: 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
f3c0: 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  dex;.    while( 
f3d0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
f3e0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
f3f0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
f400: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74  ace ){.      pOt
f410: 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
f420: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
f430: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
f440: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
f450: 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
f460: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  = pIndex;.  }.. 
f470: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
f480: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
f490: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
f4a0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
f4b0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
f4c0: 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  te_master" table
f4d0: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53   on the disk.  S
f4e0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
f4f0: 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20  o the disk.  ** 
f500: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
f510: 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  the table number
f520: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
f530: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
f540: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f550: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 54  >init.busy && pT
f560: 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
f570: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
f580: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
f590: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
f5a0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
f5b0: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
f5c0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
f5d0: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
f5e0: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
f5f0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
f600: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f610: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
f620: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
f630: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
f640: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
f650: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62    **.  ** The db
f660: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
f670: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
f680: 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
f690: 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
f6a0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69   command.  db->i
f6b0: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68  nit.busy is 1 wh
f6c0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73  en a database is
f6d0: 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a   opened and .  *
f6e0: 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  * CREATE INDEX s
f6f0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65  tatements are re
f700: 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ad out of the ma
f710: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a  ster table.  In.
f720: 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20    ** the latter 
f730: 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61  case the index a
f740: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e  lready exists on
f750: 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20   disk, which is 
f760: 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  why.  ** we don'
f770: 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61  t want to recrea
f780: 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  te it..  **.  **
f790: 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
f7a0: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
f7b0: 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
f7c0: 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   as a primary ke
f7d0: 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  y.  ** or UNIQUE
f7e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61   constraint of a
f7f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
f800: 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
f810: 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
f820: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
f830: 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
f840: 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
f850: 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
f860: 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
f870: 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
f880: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
f890: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
f8a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  0 ){.    int n;.
f8b0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
f8c0: 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b   int lbl1, lbl2;
f8d0: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
f8e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f8f0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
f900: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
f910: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
f920: 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
f930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
f940: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
f950: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
f960: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
f970: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
f980: 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20  , iDb);.    }.  
f990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9a0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
f9b0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
f9c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
f9d0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
f9e0: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
f9f0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
fa00: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
fa10: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
fa20: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
fa30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fa40: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
fa50: 67 38 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  g8, 0, 0, pTab->
fa60: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
fa70: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
fa80: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
fa90: 20 30 2c 20 69 44 62 2c 28 63 68 61 72 2a 29 26   0, iDb,(char*)&
faa0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f  pIndex->tnum,P3_
fab0: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49  POINTER);.    pI
fac0: 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a  ndex->tnum = 0;.
fad0: 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
fae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
faf0: 33 56 64 62 65 43 6f 64 65 28 76 2c 0a 20 20 20  3VdbeCode(v,.   
fb00: 20 20 20 20 20 20 20 4f 50 5f 44 75 70 2c 20 20         OP_Dup,  
fb10: 20 20 20 20 20 30 2c 20 20 20 20 20 20 30 2c 0a       0,      0,.
fb20: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 49 6e 74            OP_Int
fb30: 65 67 65 72 2c 20 20 20 69 44 62 2c 20 20 20 20  eger,   iDb,    
fb40: 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a 20 20 20  0,.      0);.   
fb50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
fb60: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
fb70: 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  e, 1, 0,.       
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
fb90: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  har*)&pIndex->ke
fba0: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
fbb0: 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  O);.    }.    sq
fbc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fbd0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
fbe0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
fbf0: 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
fc00: 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72       if( onError
fc10: 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  ==OE_None ){.   
fc20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc30: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
fc40: 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 22 2c  "CREATE INDEX ",
fc50: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
fc60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fc80: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52  ngeP3(v, -1, "CR
fc90: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
fca0: 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  X ", P3_STATIC);
fcb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fcc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fcd0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
fce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  , 0);.      n = 
fcf0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
fd00: 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b  Addr(pName->z) +
fd10: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
fd20: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
fd30: 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e   -1, pName->z, n
fd40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fd50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd60: 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20  Concat, 2, 0);. 
fd70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fd80: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
fd90: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20  keRecord, 5, 0, 
fda0: 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54  "tttit", P3_STAT
fdb0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
fdc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fdd0: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
fde0: 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
fdf0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
fe00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fe10: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
fe20: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
fe30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fe40: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  p(v, OP_OpenRead
fe50: 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  , 2, pTab->tnum)
fe60: 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64 62 65 43  ;.      /* VdbeC
fe70: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
fe80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20   pTab->zName)); 
fe90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
feb0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32  SetNumColumns, 2
fec0: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20  , pTab->nCol);. 
fed0: 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69       lbl2 = sqli
fee0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
fef0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
ff00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ff10: 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c  P_Rewind, 2, lbl
ff20: 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  2);.      lbl1 =
ff30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
ff40: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
ff50: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
ff60: 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e  eIndexKey(v, pIn
ff70: 64 65 78 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  dex, 2);.      s
ff80: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
ff90: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
ffa0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
ffb0: 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20  OE_None,.       
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ffd0: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
ffe0: 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
fff0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10010 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
10020 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  2, lbl1);.      
10030 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10040 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29  veLabel(v, lbl2)
10050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10060 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10070 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20  lose, 2, 0);.   
10080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10090 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
100a0 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
100b0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
100c0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
100d0 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
100e0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
100f0 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
10100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10120 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
10130 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10140 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
10150 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
10160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
10170 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
10180 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
10190 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
101a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
101b0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 2f 2a  ete(pList);.  /*
101c0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
101d0 65 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 20 2a  elete(pTable); *
101e0 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  /.  sqliteFree(z
101f0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
10200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10210 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
10220 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
10230 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
10240 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
10250 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
10260 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
10270 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
10280 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
10290 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
102a0 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
102b0 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
102c0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
102d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
102e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
102f0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
10300 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
10310 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
10320 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
10330 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
10340 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
10350 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
10360 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
10370 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
10380 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
10390 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
103a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
103b0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
103c0 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
103d0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
103e0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
103f0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
10400 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
10410 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
10420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10430 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10440 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
10450 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
10460 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
10470 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
10480 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
10490 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
104a0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
104b0 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28 20 70  ;.  }./*.  if( p
104c0 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
104d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
104e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
104f0 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
10500 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
10510 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
10520 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
10530 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
10540 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  .  }.*/.#ifndef 
10550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
10560 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
10570 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
10580 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
10590 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
105a0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
105b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
105c0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
105d0 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61  pIndex->iDb].zNa
105e0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
105f0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
10600 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e  A_TABLE(pIndex->
10610 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
10620 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10630 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
10640 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
10650 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
10660 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
10670 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
10680 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63   pIndex->iDb ) c
10690 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
106a0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
106b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
106c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
106d0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
106e0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
106f0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
10700 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
10710 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
10720 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
10730 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
10740 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
10750 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
10760 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
10770 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10780 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
10790 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
107a0 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e  dbeOpList dropIn
107b0 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dex[] = {.      
107c0 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
107d0 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
107e0 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72   .      { OP_Str
107f0 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 30 2c 20  ing8,     0, 0, 
10800 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
10810 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
10820 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
10830 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
10840 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
10850 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
10860 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
10870 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
10880 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
10890 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
108a0 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
108b0 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
108c0 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
108d0 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
108e0 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
108f0 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
10900 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
10910 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
10920 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
10930 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
10940 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c  t base;..    sql
10950 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
10960 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
10970 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  0, pIndex->iDb);
10980 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
10990 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
109a0 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
109b0 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56   base = sqlite3V
109c0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
109d0 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
109e0 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
109f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10a00 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
10a10 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
10a20 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
10a30 70 49 6e 64 65 78 2d 3e 69 44 62 21 3d 31 20 29  pIndex->iDb!=1 )
10a40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
10a50 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
10a60 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  v, pIndex->iDb);
10a70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10a80 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10a90 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
10aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ab0 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
10ac0 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  oy, pIndex->tnum
10ad0 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
10ae0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
10af0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
10b00 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
10b10 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65  Delete the in-me
10b20 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e  mory description
10b30 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a   of this index..
10b40 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
10b50 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
10b60 20 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b     sqlite3Unlink
10b70 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
10b80 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  b, pIndex);.    
10b90 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10ba0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
10bb0 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  s;.  }..exit_dro
10bc0 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
10bd0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
10be0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
10bf0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
10c00 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
10c10 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
10c20 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
10c30 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
10c40 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
10c50 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
10c60 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
10c70 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
10c80 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
10c90 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
10ca0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
10cb0 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
10cc0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
10cd0 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
10ce0 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
10cf0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
10d00 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
10d10 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
10d20 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
10d30 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d  if( pList->nId>=
10d40 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
10d50 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
10d60 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
10d70 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
10d80 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
10d90 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 5;.    a = sql
10da0 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
10db0 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
10dc0 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
10dd0 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
10de0 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
10df0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
10e00 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
10e10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10e20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
10e30 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
10e40 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
10e50 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
10e60 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
10e70 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
10e80 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
10e90 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
10ea0 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->nId].zName;.  
10eb0 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
10ec0 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ing(pz, pToken->
10ed0 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
10ee0 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
10ef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10f00 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
10f10 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
10f20 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
10f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10f40 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
10f50 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e  }.  }.  pList->n
10f60 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
10f70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
10f80 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
10f90 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
10fa0 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
10fb0 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
10fc0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
10fd0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
10fe0 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
10ff0 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
11000 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
11010 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
11020 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
11030 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
11040 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
11050 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
11060 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
11070 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
11080 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
11090 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
110a0 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
110b0 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
110c0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
110d0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
110e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
110f0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
11100 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
11110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
11120 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
11130 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
11140 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
11150 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
11160 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
11170 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
11180 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
11190 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
111a0 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
111b0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
111c0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
111d0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
111e0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
111f0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
11200 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
11210 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
11220 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
11230 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
11240 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
11250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
11260 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
11270 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
11280 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
11290 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
112a0 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
112b0 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
112c0 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
112d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
112e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
112f0 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
11300 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
11310 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
11320 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
11330 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
11340 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
11350 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
11360 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
11370 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44  Table, Token *pD
11380 61 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20  atabase){.  if( 
11390 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
113a0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
113b0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63  lloc( sizeof(Src
113c0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
113d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
113e0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
113f0 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
11400 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
11410 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
11420 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
11430 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
11440 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
11450 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
11460 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11480 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
11490 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
114a0 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
114b0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
114c0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
114d0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
114e0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
114f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11500 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
11510 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pNew;.  }.  mem
11520 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
11530 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
11540 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
11550 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ]));.  if( pData
11560 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
11570 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
11580 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
11590 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
115a0 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20  e && pTable ){. 
115b0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
115c0 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
115d0 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
115e0 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
115f0 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69  = pTemp;.  }.  i
11600 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
11610 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
11620 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
11630 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  rc].zName;.    s
11640 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
11650 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20  (pz, pTable->z, 
11660 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20  pTable->n, 0);. 
11670 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
11680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
11690 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
116a0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
116b0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
116c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
116d0 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a  ote(*pz);.    }.
116e0 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
116f0 61 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ase ){.    char 
11700 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
11710 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44  [pList->nSrc].zD
11720 61 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c  atabase;.    sql
11730 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
11740 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c  z, pDatabase->z,
11750 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30   pDatabase->n, 0
11760 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
11770 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11780 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
11790 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
117a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
117b0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
117c0 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
117d0 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
117e0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
117f0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
11800 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
11810 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
11820 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
11830 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
11840 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
11850 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
11860 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
11870 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
11880 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
11890 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
118a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
118b0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
118c0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
118d0 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a  i].iCursor<0 ){.
118e0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
118f0 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ].iCursor = pPar
11900 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
11910 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
11920 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74  dd an alias to t
11930 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69  he last identifi
11940 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  er on the given 
11950 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e  identifier list.
11960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11970 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28  SrcListAddAlias(
11980 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
11990 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
119a0 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
119b0 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  List->nSrc>0 ){.
119c0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
119d0 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20  t->nSrc - 1;.   
119e0 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
119f0 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
11a00 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
11a10 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
11a20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
11a30 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  uote(pList->a[i]
11a40 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a  .zAlias);.  }.}.
11a50 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
11a60 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
11a70 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
11a80 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
11a90 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
11aa0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
11ab0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
11ac0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
11ad0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11ae0 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
11af0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
11b00 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
11b10 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
11b20 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
11b30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
11b40 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
11b50 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
11b60 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
11b70 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
11b80 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
11b90 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
11ba0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
11bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
11bc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
11bd0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
11be0 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
11bf0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
11c00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
11c10 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
11c20 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
11c30 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
11c40 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
11c50 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
11c60 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
11c70 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
11c80 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
11c90 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
11ca0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
11cb0 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
11cc0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
11cd0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
11ce0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
11cf0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
11d00 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  rc; i++){.    sq
11d10 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
11d20 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[i].zDatabase);
11d30 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11d40 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
11d50 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
11d60 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
11d70 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
11d80 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
11d90 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e   && pList->a[i].
11da0 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
11db0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
11dc0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
11dd0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
11de0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
11df0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
11e00 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  e(pList->a[i].pS
11e10 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
11e20 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c  te3ExprDelete(pL
11e30 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a  ist->a[i].pOn);.
11e40 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
11e50 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
11e60 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  [i].pUsing);.  }
11e70 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
11e80 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
11e90 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
11ea0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
11eb0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
11ec0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
11ed0 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
11ee0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
11ef0 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
11f00 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
11f10 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
11f20 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
11f30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
11f40 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
11f50 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
11f60 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
11f70 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11f80 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
11f90 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
11fa0 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  N", 0, 0) ) retu
11fb0 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
11fc0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11fd0 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
11fe0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
11ff0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
12000 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
12010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
12020 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
12030 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
12040 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
12050 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
12060 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
12070 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
12080 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
12090 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
120a0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
120b0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
120c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
120d0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
120e0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
120f0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
12100 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
12110 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
12120 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
12130 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
12140 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
12150 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12160 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
12170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12180 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
12190 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
121a0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
121b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
121c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
121d0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
121e0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
121f0 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
12200 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
12210 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
12220 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
12230 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
12240 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
12250 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12260 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
12270 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
12280 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
12290 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
122a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
122b0 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
122c0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
122d0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
122e0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
122f0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
12300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12310 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
12320 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
12330 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
12340 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
12350 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
12360 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
12370 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
12380 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
12390 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
123a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
123b0 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
123c0 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
123d0 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
123e0 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
123f0 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
12400 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
12410 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
12420 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
12430 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
12440 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
12450 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
12460 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
12470 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
12480 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
12490 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
124a0 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
124b0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
124c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
124d0 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
124e0 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 68 61 74  an OP_Gosub that
124f0 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f  .** will jump to
12500 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74   a subroutine at
12510 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
12520 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77  program.  Then w
12530 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72  e.** record ever
12540 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
12550 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61  needs its schema
12560 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65   verified in the
12570 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  .** pParse->cook
12580 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c  ieMask field.  L
12590 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20  ater, after all 
125a0 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62  other code has b
125b0 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  een.** generated
125c0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
125d0 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63   that does the c
125e0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
125f0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74  ons and.** start
12600 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
12610 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64  ns will be coded
12620 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 73 75   and the OP_Gosu
12630 62 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69  b P2 value.** wi
12640 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f  ll be made to po
12650 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72  int to that subr
12660 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e  outine.  The gen
12670 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  eration of the.*
12680 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  * cookie verific
12690 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  ation subroutine
126a0 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e   code happens in
126b0 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
126c0 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
126d0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
126e0 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
126f0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
12700 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
12710 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
12720 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
12730 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12740 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
12750 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
12760 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
12770 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
12780 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
12790 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
127a0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
127b0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
127c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
127d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
127e0 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
127f0 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32 20   assert( iDb<32 
12800 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
12810 3e 63 6f 6f 6b 69 65 4d 61 73 6b 3d 3d 30 20 29  >cookieMask==0 )
12820 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
12830 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
12840 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12850 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
12860 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69   }.  mask = 1<<i
12870 44 62 3b 0a 20 20 69 66 28 20 28 70 50 61 72 73  Db;.  if( (pPars
12880 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
12890 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
128a0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
128b0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
128c0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
128d0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
128e0 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
128f0 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ookie;.  }.}../*
12900 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
12910 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
12920 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
12930 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
12940 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
12950 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
12960 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12970 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
12980 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
12990 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
129a0 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
129b0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
129c0 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
129d0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
129e0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
129f0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
12a00 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
12a10 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
12a20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
12a30 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
12a40 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
12a50 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
12a60 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
12a70 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
12a80 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
12a90 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
12aa0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
12ab0 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
12ac0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
12ad0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
12ae0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
12af0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
12b00 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
12b10 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
12b20 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
12b30 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
12b40 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
12b50 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
12b60 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
12b70 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
12b80 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
12b90 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
12ba0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
12bb0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
12bc0 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
12bd0 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
12be0 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
12bf0 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
12c00 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
12c10 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
12c20 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
12c30 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
12c40 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
12c50 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
12c60 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
12c70 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
12c80 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
12c90 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
12ca0 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
12cb0 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
12cc0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
12cd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
12ce0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
12cf0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
12d00 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
12d10 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  t, int iDb){.  s
12d20 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
12d30 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
12d40 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12d50 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
12d60 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
12d70 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
12d80 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
12d90 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73  e, iDb);.  pPars
12da0 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  e->writeMask |= 
12db0 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65  1<<iDb;.  if( se
12dc0 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  tStatement ){.  
12dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12de0 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
12df0 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
12e00 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
12e10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
12e20 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
12e30 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
12e40 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
12e50 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12e60 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75  code that conclu
12e70 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  des an operation
12e80 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
12e90 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61  hanged.** the da
12ea0 74 61 62 61 73 65 2e 20 20 49 66 20 61 20 73 74  tabase.  If a st
12eb0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12ec0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
12ed0 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e   then emit.** an
12ee0 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20   OP_Commit that 
12ef0 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 63  will cause the c
12f00 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63 6f 6d  hanges to be com
12f10 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
12f20 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
12f30 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72 65 20  checkpoints are 
12f40 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
12f50 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65 20 65  mmitted at the e
12f60 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65  nd of.** a state
12f70 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ment.  Note also
12f80 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e 20   that there can 
12f90 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c  be multiple call
12fa0 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
12fb0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
12fc0 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65 20  ion() but there 
12fd0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61  should only be a
12fe0 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20   single.** call 
12ff0 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69  to sqlite3EndWri
13000 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61 74  teOperation() at
13010 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
13020 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
13030 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13040 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
13050 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
13060 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 6d  ){.  /* Delete m
13070 65 21 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  e! */.  return;.
13080 7d 0a                                            }.