/ Hex Artifact Content
Login

Artifact 1943d5910d0a9807dd788758c41c5b1900a8da78:


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 37 20 32 30 30 34 2f 30 36 2f 31 32 20 30  217 2004/06/12 0
0300: 30 3a 34 32 3a 33 35 20 64 61 6e 69 65 6c 6b 31  0:42:35 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 23 69 66 20 30 0a 20 20 69 66 28 28 64 62 2d 3e  #if 0.  if((db->
04c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
04d0: 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 26  nitialized)==0 &
04e0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
04f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
0500: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
0510: 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  b, &pParse->zErr
0520: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
0530: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0540: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0550: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72  = rc;.      pPar
0560: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0570: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  }.  }.#endif.  f
0580: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0590: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 43  b; i++){.    DbC
05a0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
05b0: 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a   i, DB_Locked);.
05c0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62      if( !db->aDb
05d0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  [i].inTrans ){. 
05e0: 20 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70       DbClearProp
05f0: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 43  erty(db, i, DB_C
0600: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ookie);.    }.  
0610: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  }.  pParse->nVar
0620: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
0630: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0640: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0650: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0660: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0670: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0680: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0690: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
06a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
06b0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
06c0: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
06d0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
06e0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
06f0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0700: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0710: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0720: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0730: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0740: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0750: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0760: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0770: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0780: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
07a0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
07b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
07c0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
07d0: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
07e0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
07f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0800: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0810: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0820: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0830: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0840: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0850: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
0860: 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
0870: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0880: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
0890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
08a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  ddOp(v, OP_Halt,
08b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
08c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
08d0: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  sk!=0 ){.      u
08e0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08f0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
0900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0910: 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  2(v, pParse->coo
0920: 6b 69 65 47 6f 74 6f 2c 20 73 71 6c 69 74 65 33  kieGoto, sqlite3
0930: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
0940: 76 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  v));.      for(i
0950: 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44  Db=0, mask=1; iD
0960: 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c  b<db->nDb; mask<
0970: 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20  <=1, iDb++){.   
0980: 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26       if( (mask &
0990: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
09a0: 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ask)==0 ) contin
09b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
09c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
09d0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
09e0: 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61  iDb, (mask & pPa
09f0: 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21  rse->writeMask)!
0a00: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
0a10: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
0a40: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70  fyCookie, iDb, p
0a50: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
0a60: 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20  ue[iDb]);.      
0a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a90: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0aa0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0ab0: 47 6f 74 6f 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Goto+1);.    }. 
0ac0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
0ad0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0ae0: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0af0: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0b00: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0b10: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0b20: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0b30: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0b40: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0b50: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0b60: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0b70: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0b80: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0b90: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0ba0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0bb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0bc0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0bd0: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0be0: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0bf0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0c00: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0c10: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0c30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0c40: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0c50: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0c60: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0c70: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0c80: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0c90: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0ca0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0cb0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0cc0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ce0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0cf0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d00: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0d10: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0d20: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0d30: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0d40: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0d50: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0d60: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0d70: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0d80: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0d90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0da0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0db0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0dc0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0dd0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0de0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0df0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0e00: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0e10: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0e20: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0e30: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0e40: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0e50: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0e60: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0e70: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0e80: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0e90: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0ea0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0eb0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0ec0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
0ed0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
0ee0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
0ef0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
0f00: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
0f10: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
0f20: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
0f30: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
0f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 61 64  rc = sqlite3Read
0f60: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
0f70: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
0f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
0f90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0fa0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0fb0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0fc0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0fd0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0fe0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0ff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1000: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1010: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1030: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1040: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1050: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1060: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1070: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
10a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
10b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
10c0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
10d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
10e0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
10f0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
1100: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1110: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1120: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1130: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
1140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1150: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1160: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
1170: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1180: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1190: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
11a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
11b0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
11c0: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
11d0: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
11e0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
11f0: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1200: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1210: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
1220: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
1230: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1240: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
1250: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1260: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1280: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1290: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
12a0: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
12b0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
12c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
12d0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
12e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
12f0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
1300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1310: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1320: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1330: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1340: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1350: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1360: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1370: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1380: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1390: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
13a0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
13b0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
13c0: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
13d0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
13e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1400: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1410: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1420: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1430: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1440: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1450: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
14a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
14b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
14c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
14d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
14e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
14f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
15a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
15b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
15c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
15d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
15e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
15f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1640: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
1650: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1670: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1680: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1690: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
16a0: 61 64 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  adSchema(db, 0);
16b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
16c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
16d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16e0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
16f0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
1700: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
1710: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
1720: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
1730: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1740: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1760: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1770: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69  nd(&db->aDb[j].i
1780: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1790: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
17a0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
17b0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
17c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   p;.}../*.** Rem
17d0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
17e0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
17f0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
1800: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
1810: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
1820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1830: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1840: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1850: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1860: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1870: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1880: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1890: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
18a0: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
18b0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
18c0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
18d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
18e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
18f0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
1900: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1910: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20   Index *pOld;.. 
1920: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26   assert( db!=0 &
1930: 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  & p->zName!=0 );
1940: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
1950: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
1960: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
1970: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
19a0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
19b0: 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20  ;.  if( pOld!=0 
19c0: 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20  && pOld!=p ){.  
19d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
19e0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
19f0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f  iDb].idxHash, pO
1a00: 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ld->zName,.     
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61  strlen(pOld->zNa
1a30: 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20  me)+1, pOld);.  
1a40: 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41  }.  if( p->zColA
1a50: 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
1a60: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1a70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1a80: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1a90: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1aa0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
1ab0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
1ac0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
1ad0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1ae0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1af0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1b00: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
1b20: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1b30: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1b40: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1b50: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
1b60: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
1b70: 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  x ){.    pIndex-
1b80: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1b90: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
1bb0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  dex *p;.    for(
1bc0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
1bd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
1be0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
1bf0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
1c00: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
1c10: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
1c20: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
1c30: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c50: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1c60: 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  , pIndex);.}../*
1c70: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
1c80: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
1c90: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
1ca0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1cb0: 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  of.** database c
1cc0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
1cd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ce0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
1cf0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
1d00: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  he connection cl
1d10: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
1d20: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
1d30: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
1d40: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
1d50: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
1d60: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1d70: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  n..**.** If iDb<
1d80: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
1d90: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
1da0: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
1db0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dc0: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74  es.  If iDb>=2 t
1dd0: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
1de0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
1df0: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
1e00: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
1e10: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1e20: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
1e30: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e40: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e50: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e60: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e70: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1e80: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1e90: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ea0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1eb0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ec0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ed0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1ee0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1ef0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f00: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f10: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f20: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f30: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f40: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
1f50: 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73  it(&pDb->trigHas
1f60: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
1f70: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
1f80: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
1f90: 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20  &pDb->aFKey);.  
1fa0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
1fb0: 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68  ar(&pDb->idxHash
1fc0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
1fd0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1fe0: 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b  (&temp2); pElem;
1ff0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2000: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2010: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54       Trigger *pT
2020: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48  rigger = sqliteH
2030: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
2050: 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67  eteTrigger(pTrig
2060: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
2070: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2080: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
2090: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
20a0: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  Db->tblHash, SQL
20b0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
20c0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c   0);.    for(pEl
20d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
20e0: 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65  st(&temp1); pEle
20f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2100: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2110: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2120: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
2130: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2140: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2150: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2160: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2170: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2180: 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50  1);.    DbClearP
2190: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
21a0: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b  B_SchemaLoaded);
21b0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
21c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
21d0: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
21e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
21f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2200: 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  anges;..  /* If 
2210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
2220: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2230: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
2240: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
2250: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
2260: 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  en from the auxi
2270: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
2280: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
2290: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
22a0: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
22b0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
22c0: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
22d0: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
22e0: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
22f0: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
2300: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
2310: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
2320: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
2330: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2340: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
2350: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2360: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2370: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2380: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
23a0: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
23b0: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
23c0: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
23d0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
23e0: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
23f0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
2400: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
2410: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
2420: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2430: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
2440: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
2450: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44     sqliteFree(pD
2460: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2470: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
2480: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2490: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
24a0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
24b0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
24c0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
24d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
24e0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
24f0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
2500: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
2510: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
2520: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
2530: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
2540: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
2550: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
2560: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
2570: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
2580: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
2590: 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29  iteFree(db->aDb)
25a0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
25b0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
25c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
25d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25e0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
25f0: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20  llback occurs.  
2600: 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a  If there were.**
2610: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2620: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
2630: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20  action, then we 
2640: 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68  have to reset th
2650: 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61  e.** internal ha
2660: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65  sh tables and re
2670: 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64  load them from d
2680: 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  isk..*/.void sql
2690: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  ite3RollbackInte
26a0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
26b0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
26c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
26d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
26e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
26f0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2700: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
2710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2720: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2730: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
2740: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
2750: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
2760: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2770: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
2780: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
2790: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
27a0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
27b0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
27c0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
27d0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
27e0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
27f0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2800: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2810: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2820: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2830: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2840: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
2850: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
2860: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
2870: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
2880: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
2890: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
28a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
28b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
28c0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
28d0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
28e0: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
28f0: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2900: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2910: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2920: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2930: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2940: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
2950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2960: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
2970: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
2980: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2990: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
29a0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
29b0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
29c0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
29d0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
29e0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
29f0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2a00: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2a10: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2a20: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2a30: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2a40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2a50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
2a60: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
2a70: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
2a80: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
2a90: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
2aa0: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
2ab0: 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54  tFKey;..  if( pT
2ac0: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
2ad0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
2ae0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
2af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2b00: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
2b10: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
2b20: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
2b30: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
2b40: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
2b50: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2b60: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
2b70: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
2b80: 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62   || (pTable->iDb
2b90: 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  ==0 && pIndex->i
2ba0: 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71  Db==1) );.    sq
2bb0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2bc0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
2bd0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2be0: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
2bf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c00: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
2c10: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
2c20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
2c30: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
2c40: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
2c50: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
2c60: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
2c70: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
2c80: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
2c90: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
2ca0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
2cb0: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
2cc0: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62  ( pTable->iDb<db
2cd0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
2ce0: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
2cf0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
2d00: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
2d10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
2d30: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
2d40: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
2d50: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
2d60: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
2d70: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
2d80: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2d90: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
2da0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2db0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
2dc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2dd0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
2de0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
2df0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e00: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
2e10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2e30: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
2e40: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
2e60: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2e70: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ol);.  if( pTabl
2e80: 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20  e->zColAff ){.  
2e90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2ea0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
2eb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2ec0: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
2ed0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
2ee0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
2ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
2f00: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
2f10: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
2f20: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
2f30: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
2f40: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
2f50: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
2f60: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
2f70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2f80: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
2f90: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
2fa0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
2fb0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
2fc0: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
2fd0: 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20  *pF2;.  int i = 
2fe0: 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  p->iDb;.  assert
2ff0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
3000: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
3010: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
3020: 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].tblHash, p->zN
3030: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
3040: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
3050: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
3060: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
3070: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
3080: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
3090: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69  NextFrom){.    i
30a0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
30b0: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
30c0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
30d0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
30e0: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
30f0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3100: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
3110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
3120: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
3130: 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  [i].aFKey, pF1->
3140: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
3150: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c  NextTo);.    }el
3160: 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
3170: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
3180: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
3190: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
31a0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29  .      if( pF2 )
31b0: 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70  {.        pF2->p
31c0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
31d0: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  extTo;.      }. 
31e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
31f0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
3200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , p);.}../*.** C
3210: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d  onstruct the nam
3220: 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c  e of a user tabl
3230: 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
3240: 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53  a token..**.** S
3250: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3260: 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65   name is obtaine
3270: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3280: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a  loc() and must.*
3290: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
32a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
32b0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
32c0: 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f  ite3TableNameFro
32d0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
32e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
32f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
3300: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
3310: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74  ame->n);.  sqlit
3320: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3330: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
3350: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3360: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
3370: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
3380: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
3390: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
33a0: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
33b0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
33c0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
33d0: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
33e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
33f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3400: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
3410: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
3420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3430: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
3440: 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71  STER_ROOT);.  sq
3450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3460: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
3470: 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71  ns, 0, 5); /* sq
3480: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
3490: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a  5 columns */.}..
34a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
34b0: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
34c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
34d0: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
34e0: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
34f0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
3500: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
3510: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
3520: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
3530: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
3540: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
3550: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
3560: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
3570: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
3580: 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62  t..*/.int findDb
3590: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
35a0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
35b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
35c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
35d0: 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d  {.    if( pName-
35e0: 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61  >n==strlen(db->a
35f0: 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20  Db[i].zName) && 
3600: 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69  .        0==sqli
3610: 74 65 33 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e  te3StrNICmp(db->
3620: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  aDb[i].zName, pN
3630: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3640: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3650: 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n i;.    }.  }. 
3660: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69   return -1;.}..i
3670: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
3680: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
3690: 70 50 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e  pParse, .  Token
36a0: 20 2a 70 4e 61 6d 65 31 2c 20 0a 20 20 54 6f 6b   *pName1, .  Tok
36b0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 0a 20 20 54  en *pName2, .  T
36c0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a 29  oken **pUnqual.)
36d0: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  {.  int iDb;.  s
36e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
3700: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
3710: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
3720: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
3730: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
3740: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
3750: 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64    iDb = findDb(d
3760: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
3770: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
3780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3790: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
37a0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
37b0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
37c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
37d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
37e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
37f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3800: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
3810: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
3820: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
3830: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
3840: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
3850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
3860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 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 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6b50: 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31  8;.      pColl[1
6b60: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
6b70: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
6b80: 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d    pColl[1].enc =
6b90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b   SQLITE_UTF16LE;
6ba0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e  .      pColl[2].
6bb0: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
6bc0: 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20  pColl[3];.      
6bd0: 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53  pColl[2].enc = S
6be0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
6bf0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
6c00: 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[0].zName, zNam
6c10: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
6c20: 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b   pColl[0].zName[
6c30: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
6c40: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
6c50: 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ert(&db->aCollSe
6c60: 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d  q, pColl[0].zNam
6c70: 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29  e, nName, pColl)
6c80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6c90: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
6ca0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
6cb0: 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  Name points to a
6cc0: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73   UTF-8 encoded s
6cd0: 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65  tring nName byte
6ce0: 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72  s long..** Retur
6cf0: 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70  n the CollSeq* p
6d00: 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63  ointer for the c
6d10: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6d20: 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a  e named zName.**
6d30: 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e   for the encodin
6d40: 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65  g 'enc' from the
6d50: 20 64 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a   database 'db'..
6d60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74  **.** If the ent
6d70: 72 79 20 73 70 65 63 69 66 69 65 64 20 69 73 20  ry specified is 
6d80: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63  not found and 'c
6d90: 72 65 61 74 65 27 20 69 73 20 74 72 75 65 2c 20  reate' is true, 
6da0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a  then create a.**
6db0: 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68   new entry.  Oth
6dc0: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
6dd0: 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  LL..*/.CollSeq *
6de0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
6df0: 65 71 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  eq(.  sqlite *db
6e00: 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f  ,.  u8 enc,.  co
6e10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6e20: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20  .  int nName,.  
6e30: 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20  int create.){.  
6e40: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
6e50: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
6e60: 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  y(db, zName, nNa
6e70: 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20 20 69  me, create);.  i
6e80: 66 28 20 70 43 6f 6c 6c 20 29 20 73 77 69 74 63  f( pColl ) switc
6e90: 68 28 20 65 6e 63 20 29 7b 0a 20 20 20 20 63 61  h( enc ){.    ca
6ea0: 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a  se SQLITE_UTF8:.
6eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6ec0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
6ed0: 31 36 4c 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c  16LE:.      pCol
6ee0: 6c 20 3d 20 26 70 43 6f 6c 6c 5b 31 5d 3b 0a 20  l = &pColl[1];. 
6ef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6f00: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
6f10: 36 42 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6BE:.      pColl
6f20: 20 3d 20 26 70 43 6f 6c 6c 5b 32 5d 3b 0a 20 20   = &pColl[2];.  
6f30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
6f40: 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 61  efault: .      a
6f50: 73 73 65 72 74 28 21 22 43 61 6e 6e 6f 74 20 68  ssert(!"Cannot h
6f60: 61 70 70 65 6e 22 29 3b 0a 20 20 7d 0a 20 20 72  appen");.  }.  r
6f70: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
6f80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c  static void call
6f90: 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74  CollNeeded(sqlit
6fa0: 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  e *db, const cha
6fb0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
6fc0: 61 6d 65 29 7b 0a 20 20 2f 2a 20 4e 6f 20 63 6f  ame){.  /* No co
6fd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
6fe0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f   of this type fo
6ff0: 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20  r this encoding 
7000: 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20  is registered.. 
7010: 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c   ** Call the col
7020: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74  lation factory t
7030: 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20  o see if it can 
7040: 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f  supply us with o
7050: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  ne..  */.  char 
7060: 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 30 3b 0a  *zExternal = 0;.
7070: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 78    assert( !db->x
7080: 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64  CollNeeded || !d
7090: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
70a0: 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c   );.  if( nName<
70b0: 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  0 ) nName = strl
70c0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(zName);.  if(
70d0: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
70e0: 20 29 7b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61   ){.    zExterna
70f0: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
7100: 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  p(zName, nName);
7110: 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72  .    if( !zExter
7120: 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nal ) return;.  
7130: 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65      db->xCollNee
7140: 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ded(db->pCollNee
7150: 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74  dedArg, db, (int
7160: 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72  )db->enc, zExter
7170: 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nal);.  }.  if( 
7180: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
7190: 36 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  6 ){.    if( SQL
71a0: 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 20 29 7b  ITE_BIGENDIAN ){
71b0: 0a 20 20 20 20 20 20 7a 45 78 74 65 72 6e 61 6c  .      zExternal
71c0: 20 3d 20 73 71 6c 69 74 65 33 75 74 66 38 74 6f   = sqlite3utf8to
71d0: 31 36 62 65 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  16be(zName, nNam
71e0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
71f0: 20 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d       zExternal =
7200: 20 73 71 6c 69 74 65 33 75 74 66 38 74 6f 31 36   sqlite3utf8to16
7210: 6c 65 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  le(zName, nName)
7220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7230: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
7240: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
7250: 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70  llNeeded16(db->p
7260: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64  CollNeededArg, d
7270: 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c  b, (int)db->enc,
7280: 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d   zExternal);.  }
7290: 0a 20 20 69 66 28 20 7a 45 78 74 65 72 6e 61 6c  .  if( zExternal
72a0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45   ) sqliteFree(zE
72b0: 78 74 65 72 6e 61 6c 29 3b 0a 7d 0a 0a 73 74 61  xternal);.}..sta
72c0: 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c  tic int synthCol
72d0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
72e0: 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
72f0: 6c 6c 29 7b 0a 20 20 2f 2a 20 54 68 65 20 63 6f  ll){.  /* The co
7300: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
7310: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 69 76 65  failed to delive
7320: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 62 75 74  r a function but
7330: 20 74 68 65 72 65 20 6d 61 79 20 62 65 0a 20 20   there may be.  
7340: 2a 2a 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e  ** other version
7350: 73 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74  s of this collat
7360: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f  ion function (fo
7370: 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  r other text enc
7380: 6f 64 69 6e 67 73 29 0a 20 20 2a 2a 20 61 76 61  odings).  ** ava
7390: 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 20  ilable. Use one 
73a0: 6f 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64  of these instead
73b0: 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38 20  . Avoid a UTF-8 
73c0: 3c 2d 3e 20 55 54 46 2d 31 36 0a 20 20 2a 2a 20  <-> UTF-16.  ** 
73d0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 70 6f  conversion if po
73e0: 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 43  ssible..  */.  C
73f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 20 3d  ollSeq *pColl2 =
7400: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20   0;.  char *z = 
7410: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
7420: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
7430: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  );.  switch( pPa
7440: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 20 29 7b 0a  rse->db->enc ){.
7450: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7460: 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 70  UTF16LE:.      p
7470: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
7480: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
7490: 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  e->db, SQLITE_UT
74a0: 46 31 36 42 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b  F16BE, z, n, 0);
74b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
74c0: 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 69  Coll2 );.      i
74d0: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20  f( pColl2->xCmp 
74e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
74f0: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
7500: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
7510: 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  e->db, SQLITE_UT
7520: 46 38 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  F8, z, n, 0);.  
7530: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
7540: 6c 32 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  l2 );.      brea
7550: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  k;..    case SQL
7560: 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20  ITE_UTF16BE:.   
7570: 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69     pColl2 = sqli
7580: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70  te3FindCollSeq(p
7590: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
75a0: 5f 55 54 46 31 36 4c 45 2c 20 7a 2c 20 6e 2c 20  _UTF16LE, z, n, 
75b0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
75c0: 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20  ( pColl2 );.    
75d0: 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43    if( pColl2->xC
75e0: 6d 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  mp ) break;.    
75f0: 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74    pColl2 = sqlit
7600: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50  e3FindCollSeq(pP
7610: 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
7620: 55 54 46 38 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a  UTF8, z, n, 0);.
7630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
7640: 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 62 72  oll2 );.      br
7650: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 53  eak;..    case S
7660: 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20  QLITE_UTF8:.    
7670: 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74    pColl2 = sqlit
7680: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50  e3FindCollSeq(pP
7690: 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
76a0: 55 54 46 31 36 42 45 2c 20 7a 2c 20 6e 2c 20 30  UTF16BE, z, n, 0
76b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
76c0: 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20   pColl2 );.     
76d0: 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d   if( pColl2->xCm
76e0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  p ) break;.     
76f0: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
7700: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
7710: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55  rse->db,SQLITE_U
7720: 54 46 31 36 4c 45 2c 20 7a 2c 20 6e 2c 20 30 29  TF16LE, z, n, 0)
7730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7740: 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20  pColl2 );.      
7750: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
7760: 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 7b   pColl2->xCmp ){
7770: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c  .    memcpy(pCol
7780: 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f  l, pColl2, sizeo
7790: 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 7d  f(CollSeq));.  }
77a0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
77b0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
77c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
77d0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
77e0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
77f0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
7800: 71 75 65 6e 63 65 3a 20 22 2c 20 0a 20 20 20 20  quence: ", .    
7810: 20 20 20 20 20 20 2d 31 2c 20 7a 2c 20 6e 2c 20        -1, z, n, 
7820: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
7830: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
7840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7850: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
7860: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7870: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7880: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
7890: 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  n a collation se
78a0: 71 75 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74  quence before it
78b0: 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63   is used to.** c
78c0: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
78d0: 64 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65  defined. An unde
78e0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  fined collation 
78f0: 73 65 71 75 65 6e 63 65 20 65 78 69 73 74 73 20  sequence exists 
7900: 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61  when.** a databa
7910: 73 65 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61  se is loaded tha
7920: 74 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  t contains refer
7930: 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69  ences to collati
7940: 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20  on sequences.** 
7950: 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65  that have not be
7960: 65 6e 20 64 65 66 69 6e 65 64 20 62 79 20 73 71  en defined by sq
7970: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
7980: 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a  lation() etc..**
7990: 0a 2a 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c  .** If required,
79a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
79b0: 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69  lls the 'collati
79c0: 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62  on needed' callb
79d0: 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ack to.** reques
79e0: 74 20 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  t a definition o
79f0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  f the collating 
7a00: 73 65 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69  sequence. If thi
7a10: 73 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20  s doesn't work, 
7a20: 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e  .** an equivalen
7a30: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
7a40: 65 6e 63 65 20 74 68 61 74 20 75 73 65 73 20 61  ence that uses a
7a50: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64   text encoding d
7a60: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
7a70: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7a80: 73 65 20 69 73 20 73 75 62 73 74 69 74 75 74 65  se is substitute
7a90: 64 2c 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61  d, if one is ava
7aa0: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ilable..*/.int s
7ab0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
7ac0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
7ad0: 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  , CollSeq *pColl
7ae0: 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  ){.  if( pColl &
7af0: 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  & !pColl->xCmp )
7b00: 7b 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  {.    callCollNe
7b10: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
7b20: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73   pColl->zName, s
7b30: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
7b40: 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  me));.    if( !p
7b50: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79  Coll->xCmp && sy
7b60: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
7b70: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
7b80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7b90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7ba0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7bb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
7bc0: 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f  ite3CheckIndexCo
7bd0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
7be0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
7bf0: 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b  ){.  if( pIdx ){
7c00: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
7c20: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
7c30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7c40: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
7c50: 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49  arse, pIdx->keyI
7c60: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b  nfo.aColl[i]) ){
7c70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7c80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7ca0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7cb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
7cc0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
7cd0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
7ce0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
7cf0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
7d00: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
7d10: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
7d20: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
7d30: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
7d40: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
7d50: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
7d60: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
7d70: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
7d80: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
7d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
7da0: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
7db0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
7dc0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
7dd0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
7de0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
7df0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
7e00: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
7e10: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
7e20: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
7e30: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
7e40: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
7e50: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
7e60: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
7e70: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
7e80: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
7e90: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
7ea0: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
7eb0: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
7ec0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
7ed0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
7ee0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
7ef0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
7f00: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
7f10: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f  ** pParse..*/.Co
7f20: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
7f30: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
7f40: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
7f50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
7f60: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65  t nName){.  u8 e
7f70: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
7f80: 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62  >enc;.  u8 initb
7f90: 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  usy = pParse->db
7fa0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43  ->init.busy;.  C
7fb0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
7fc0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
7fd0: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65  eq(pParse->db, e
7fe0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
7ff0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
8000: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
8010: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
8020: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
8030: 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* No collation 
8040: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
8050: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 65   type for this e
8060: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73  ncoding is regis
8070: 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61  tered..    ** Ca
8080: 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ll the collation
8090: 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20   factory to see 
80a0: 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79  if it can supply
80b0: 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20   us with one..  
80c0: 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c    */.    callCol
80d0: 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e  lNeeded(pParse->
80e0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
80f0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
8100: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
8110: 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e  q(pParse->db, en
8120: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
8130: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
8140: 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll && !pColl->xC
8150: 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  mp ){.      /* T
8160: 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 76 65  here may be a ve
8170: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  rsion of the col
8180: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8190: 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 20 20  that requires.  
81a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69      ** translati
81b0: 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64  on between encod
81c0: 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66 6f 72  ings. Search for
81d0: 20 69 74 20 77 69 74 68 20 73 79 6e 74 68 43 6f   it with synthCo
81e0: 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20 20 2a  llSeq()..      *
81f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79 6e 74  /.      if( synt
8200: 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  hCollSeq(pParse,
8210: 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pColl) ){.     
8220: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
8230: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
8240: 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20    /* If nothing 
8250: 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20  has been found, 
8260: 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72 20  write the error 
8270: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50 61  message into pPa
8280: 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e  rse */.  if( !in
8290: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
82a0: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
82b0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  p) ){.    if( pP
82c0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
82d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
82e0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
82f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
8300: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
8310: 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c 0a 20  quence: ", -1,. 
8320: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
8330: 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  nName, 0);.    }
8340: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8350: 72 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  r++;.    pColl =
8360: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
8370: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   pColl;.}..../*.
8380: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
8390: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
83a0: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
83b0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
83c0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
83d0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f  ffinity type..*/
83e0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
83f0: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
8400: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
8410: 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e   nType){.  int n
8420: 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a  , i;.  struct {.
8430: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8440: 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72  zSub;  /* Keywor
8450: 64 73 20 73 75 62 73 74 72 69 6e 67 20 74 6f 20  ds substring to 
8460: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
8470: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
8480: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
8490: 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63 68  f zSub */.    ch
84a0: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
84b0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20   /* Affinity to 
84c0: 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d 61 74  return if it mat
84d0: 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73  ches */.  } subs
84e0: 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20  trings[] = {.   
84f0: 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c   {"INT",  3, SQL
8500: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d  ITE_AFF_INTEGER}
8510: 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c 20 34  ,.    {"CHAR", 4
8520: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  , SQLITE_AFF_TEX
8530: 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c  T},.    {"CLOB",
8540: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
8550: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54  EXT},.    {"TEXT
8560: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
8570: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c  _TEXT},.    {"BL
8580: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
8590: 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a  FF_NONE},.  };..
85a0: 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30 20 29    if( nType==0 )
85b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
85c0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
85d0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
85e0: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
85f0: 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69  )/sizeof(substri
8600: 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ngs[0]); i++){. 
8610: 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75 62 73     int c1 = subs
8620: 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30  trings[i].zSub[0
8630: 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20  ];.    int c2 = 
8640: 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20 20  tolower(c1);.   
8650: 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79   int limit = nTy
8660: 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67 73 5b  pe - substrings[
8670: 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e  i].nSub;.    con
8680: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 75 62  st char *z = sub
8690: 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b  strings[i].zSub;
86a0: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
86b0: 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20  =limit; n++){.  
86c0: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54 79 70      int c = zTyp
86d0: 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[n];.      if( 
86e0: 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29  (c==c1 || c==c2)
86f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8700: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
8710: 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a  Cmp(&zType[n], z
8720: 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  , substrings[i].
8730: 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 20  nSub) ){.       
8740: 20 72 65 74 75 72 6e 20 73 75 62 73 74 72 69 6e   return substrin
8750: 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  gs[i].affinity;.
8760: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8770: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8780: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d  E_AFF_NUMERIC;.}
8790: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
87a0: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
87b0: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
87c0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
87d0: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
87e0: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
87f0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
8800: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
8810: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
8820: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
8830: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
8840: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
8850: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
8860: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
8870: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
8880: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
8890: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
88a0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
88b0: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
88c0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
88d0: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
88e0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
88f0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
8900: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
8910: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
8920: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
8930: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
8940: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
8950: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
8960: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
8970: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
8980: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
8990: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
89a0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
89b0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
89c0: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
89d0: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
89e0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
89f0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
8a00: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
8a10: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
8a20: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
8a30: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
8a40: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
8a50: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
8a60: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
8a70: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
8a80: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
8a90: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
8aa0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
8ab0: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  okie(sqlite *db,
8ac0: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
8ad0: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  b){.  unsigned c
8ae0: 68 61 72 20 72 3b 0a 20 20 69 6e 74 20 2a 70 53  har r;.  int *pS
8af0: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 26 28  chemaCookie = &(
8b00: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
8b10: 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20 20  ema_cookie);..  
8b20: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
8b30: 73 28 31 2c 20 26 72 29 3b 0a 20 20 2a 70 53 63  s(1, &r);.  *pSc
8b40: 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a 70 53  hemaCookie = *pS
8b50: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 2b 20 72 20  chemaCookie + r 
8b60: 2b 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  + 1;.  db->flags
8b70: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
8b80: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
8b90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8ba0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2a 70 53 63  OP_Integer, *pSc
8bb0: 68 65 6d 61 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a  hemaCookie, 0);.
8bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8bd0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
8be0: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
8bf0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
8c00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
8c10: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
8c20: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
8c30: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
8c40: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
8c50: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
8c60: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
8c70: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
8c80: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
8c90: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73  terminator..*/.s
8ca0: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
8cb0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
8cc0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
8cd0: 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d   int needQuote =
8ce0: 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   0;.  for(n=0; *
8cf0: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
8d00: 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29    if( *z=='\'' )
8d10: 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65  { n++; needQuote
8d20: 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  =1; }.  }.  retu
8d30: 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65  rn n + needQuote
8d40: 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  *2;.}../*.** Wri
8d50: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
8d60: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
8d70: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
8d80: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
8d90: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
8da0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
8db0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
8dc0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
8dd0: 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29  x, char *zIdent)
8de0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  {.  int i, j, ne
8df0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
8e00: 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  pIdx;.  for(j=0;
8e10: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
8e20: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
8e30: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
8e40: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
8e50: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
8e60: 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65  eedQuote =  zIde
8e70: 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69  nt[j]!=0 || isdi
8e80: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
8eb0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
8ec0: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
8ed0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
8ee0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72  +] = '\'';.  for
8ef0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
8f00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
8f10: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
8f20: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
8f30: 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20  =='\'' ) z[i++] 
8f40: 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66  = '\'';.  }.  if
8f50: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
8f60: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a  i++] = '\'';.  z
8f70: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
8f80: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
8f90: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
8fa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8fb0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
8fc0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
8fd0: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
8fe0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
8ff0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
9000: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
9010: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
9020: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
9030: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
9040: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
9050: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
9060: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62  ateTableStmt(Tab
9070: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
9080: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
9090: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
90a0: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
90b0: 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  d;.  n = 0;.  fo
90c0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
90d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  ; i++){.    n +=
90e0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
90f0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
9100: 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b      if( p->aCol[
9110: 69 5d 2e 7a 54 79 70 65 20 29 7b 0a 20 20 20 20  i].zType ){.    
9120: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 70    n += (strlen(p
9130: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
9140: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
9150: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
9160: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
9170: 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20   if( n<40 ){.   
9180: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
9190: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
91a0: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
91b0: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
91c0: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
91d0: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
91e0: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
91f0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
9200: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
9210: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
9220: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
9230: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
9240: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
9250: 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20  Stmt, p->iDb==1 
9260: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
9270: 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45  ABLE " : "CREATE
9280: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
9290: 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a   strlen(zStmt);.
92a0: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
92b0: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
92c0: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
92d0: 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '(';.  for(i=0; 
92e0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
92f0: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
9300: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
9310: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
9320: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
9330: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
9340: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
9350: 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &k, p->aCol[i].z
9360: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
9370: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
9380: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b  ){.      zStmt[k
9390: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
93a0: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
93b0: 5d 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  ], p->aCol[i].zT
93c0: 79 70 65 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d  ype);.      k +=
93d0: 20 73 74 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b   strlen(p->aCol[
93e0: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d  i].zType);.    }
93f0: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
9400: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
9410: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
9420: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9430: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9440: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
9450: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
9460: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
9470: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9480: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
9490: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
94a0: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
94b0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
94c0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
94d0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
94e0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
94f0: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
9500: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
9510: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
9520: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
9530: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
9540: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
9550: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
9560: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
9570: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9580: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
9590: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
95a0: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
95b0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
95c0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
95d0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
95e0: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
95f0: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
9600: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
9610: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
9620: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
9630: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
9640: 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20  changes, so the 
9650: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
9660: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
9670: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
9680: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9690: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
96a0: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
96b0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
96c0: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
96d0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
96e0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
96f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
9700: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
9710: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
9720: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
9730: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
9740: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
9750: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
9760: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
9770: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
9780: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
9790: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
97a0: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
97b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
97c0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
97d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  se, Token *pEnd,
97e0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
97f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9800: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
9810: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
9820: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
9830: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
9840: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
9850: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
9860: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
9870: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9880: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9890: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
98a0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
98b0: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
98c0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
98d0: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
98e0: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
98f0: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
9900: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
9910: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
9920: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
9930: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
9940: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 7d 0a 0a  pSelect ){.  }..
9950: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
9960: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
9970: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
9980: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
9990: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
99a0: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
99b0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
99c0: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
99d0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
99e0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
99f0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
9a00: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
9a10: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
9a20: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
9a30: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
9a40: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
9a50: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
9a60: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
9a70: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
9a80: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
9a90: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
9aa0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
9ab0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
9ac0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
9ad0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
9ae0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
9af0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
9b00: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
9b10: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
9b20: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
9b30: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
9b40: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
9b50: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
9b60: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
9b70: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
9b80: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
9b90: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
9ba0: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
9bb0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
9bc0: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
9bd0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
9be0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
9bf0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
9c00: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
9c10: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
9c20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
9c30: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
9c40: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
9c50: 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73  e *v;..    v = s
9c60: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
9c70: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
9c80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
9c90: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
9ca0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
9cb0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
9cc0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
9cd0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
9ce0: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
9cf0: 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29 26 70  ->iDb, (char*)&p
9d00: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
9d10: 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER);.    }else{.
9d20: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
9d30: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d50: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
9d60: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
9d70: 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 73 71 6c 69  m = 0;..    sqli
9d80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9d90: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
9da0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
9db0: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
9dc0: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
9dd0: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
9de0: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
9df0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
9e00: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
9e10: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
9e20: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
9e30: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
9e40: 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  e is on the top 
9e50: 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63  of the vdbe stac
9e60: 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  k..    **.    **
9e70: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
9e80: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
9e90: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
9ea0: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
9eb0: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
9ec0: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
9ed0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
9ee0: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
9ef0: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
9f00: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
9f10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9f20: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
9f30: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
9f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
9f60: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
9f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9f90: 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  p->iDb, 0);.    
9fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9fb0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
9fc0: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
9fd0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
9fe0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
9ff0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
a000: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
a010: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  e, 1, 0, 0, 0, 0
a020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a040: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
a050: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
a060: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
a070: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
a080: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
a090: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
a0a0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
a0b0: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
a0c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
a0e0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
a0f0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
a100: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
a110: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
a120: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
a130: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
a140: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
a150: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
a160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a170: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
a180: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
a190: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 73  }.    }.  .    s
a1a0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
a1b0: 54 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29  Table(v, p->iDb)
a1c0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
a1d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
a1e0: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53  ng8, 0, 0, p->pS
a1f0: 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22  elect==0?"table"
a200: 3a 22 76 69 65 77 22 2c 50 33 5f 53 54 41 54 49  :"view",P3_STATI
a210: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
a220: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
a230: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a  ing8, 0, 0, p->z
a240: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
a250: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a260: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a270: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , p->zName, 0);.
a280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a290: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
a2a0: 20 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   3, 0);..    if(
a2b0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
a2c0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61    char *z = crea
a2d0: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a  teTableStmt(p);.
a2e0: 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74        n = z ? st
a2f0: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20  rlen(z) : 0;.   
a300: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a310: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
a320: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
a330: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a340: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
a350: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
a360: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
a370: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
a380: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
a390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
a3a0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a3b0: 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56 49  0, 0, "CREATE VI
a3c0: 45 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EW ", P3_STATIC)
a3d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a3e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a3f0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
a400: 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41  ng8, 0, 0, "CREA
a410: 54 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53  TE TABLE ", P3_S
a420: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
a430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
a440: 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  nd!=0 );.      n
a450: 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
a460: 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e   - Addr(pParse->
a470: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20  sNameToken.z) + 
a480: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
a490: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a4a0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
a4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a4c0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
a4d0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
a4e0: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  ken.z, n);.     
a4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a500: 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  p(v, OP_Concat, 
a510: 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2, 0);.    }.   
a520: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a530: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
a540: 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c  , 5, 0, "tttit",
a550: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a570: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
a580: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
a590: 28 20 70 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20  ( p->iDb!=1 ){. 
a5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
a5b0: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
a5c0: 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  p->iDb);.    }. 
a5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
a5f0: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c   0, 0);..    sql
a600: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
a610: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
a620: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
a630: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
a640: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
a650: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
a660: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
a670: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
a680: 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  in==0 && pParse-
a690: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
a6a0: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
a6b0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
a6c0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
a6d0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
a6e0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48  aDb[p->iDb].tblH
a6f0: 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c    p->zName, strl
a720: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
a730: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
a740: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a750: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
a760: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
a770: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
a780: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
a790: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
a7a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65    }.    for(pFKe
a7b0: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
a7c0: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
a7d0: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
a7e0: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
a7f0: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
a800: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
a810: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
a820: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
a830: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
a840: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
a850: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
a860: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
a870: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
a880: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
a890: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
a8a0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
a8b0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
a8c0: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
a8d0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
a8e0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
a8f0: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hanges;.  }.}../
a900: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
a910: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
a920: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
a930: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
a940: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a950: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
a960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a970: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
a980: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
a990: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
a9a0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
a9b0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
a9c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
a9d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
a9e0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
a9f0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
aa00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
aa10: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
aa20: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
aa30: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
aa40: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
aa50: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
aa60: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
aa70: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
aa80: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
aa90: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
aaa0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
aab0: 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54  emp         /* T
aac0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
aad0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  ARY view */.){. 
aae0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
aaf0: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
ab00: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
ab10: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
ab20: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
ab30: 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e;..  sqlite3Sta
ab40: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
ab50: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
ab60: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
ab70: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
ab80: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
ab90: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
aba0: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
abb0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
abc0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
abd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
abe0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
abf0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
ac00: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
ac10: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
ac20: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
ac30: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
ac40: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
ac50: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
ac60: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
ac70: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
ac80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
ac90: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
aca0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
acb0: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
acc0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
acd0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
ace0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
acf0: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
ad00: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
ad10: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
ad20: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
ad30: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
ad40: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
ad50: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
ad60: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
ad70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
ad80: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
ad90: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
ada0: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
adb0: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
adc0: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
add0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
ade0: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
adf0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
ae00: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
ae10: 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ct);.  if( !pPar
ae20: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
ae30: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ae40: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
ae50: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
ae60: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
ae70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
ae80: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
ae90: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
aea0: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
aeb0: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
aec0: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
aed0: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
aee0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
aef0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
af00: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
af10: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
af20: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
af30: 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20  ((int)sEnd.z) - 
af40: 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  (int)pBegin->z;.
af50: 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
af60: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
af70: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
af80: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
af90: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
afa0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
afb0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
afc0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
afd0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
afe0: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
aff0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
b000: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
b010: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
b020: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
b030: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
b040: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
b050: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
b060: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
b070: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
b080: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
b090: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
b0a0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
b0b0: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
b0c0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
b0d0: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
b0e0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
b0f0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
b100: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
b110: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
b120: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
b130: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
b140: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
b150: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
b160: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
b170: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
b180: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
b190: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
b1a0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
b1b0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
b1c0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
b1d0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
b1e0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
b1f0: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
b200: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
b210: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
b220: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
b230: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
b240: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
b250: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
b260: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
b270: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
b280: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
b290: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
b2a0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
b2b0: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
b2c0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
b2d0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
b2e0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
b2f0: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
b300: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
b310: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
b320: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
b330: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
b340: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
b350: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
b360: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
b370: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
b380: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
b390: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
b3a0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
b3b0: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
b3c0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
b3d0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
b3e0: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
b3f0: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
b400: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
b410: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
b420: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b430: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
b440: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
b450: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
b460: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
b470: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
b480: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
b490: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
b4a0: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
b4b0: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
b4c0: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
b4d0: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
b4e0: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
b4f0: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
b500: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
b510: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
b520: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
b530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
b540: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
b550: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
b560: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
b570: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
b580: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
b590: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
b5a0: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
b5b0: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
b5c0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
b5d0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
b5e0: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
b5f0: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
b600: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
b610: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
b620: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
b630: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
b640: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
b650: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
b660: 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  (pEList);.  if( 
b670: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20  pSel->pEList==0 
b680: 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c  ){.    pSel->pEL
b690: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
b6a0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
b6b0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
b6c0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  .  }.  pTable->n
b6d0: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c  Col = -1;.  pSel
b6e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
b6f0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
b700: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
b710: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
b720: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
b730: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
b740: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
b750: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
b760: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
b770: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
b780: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
b790: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
b7a0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
b7b0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
b7c0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
b7d0: 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74  lTab);.    DbSet
b7e0: 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d  Property(pParse-
b7f0: 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  >db, pTable->iDb
b800: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
b810: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
b820: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
b830: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
b840: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
b850: 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a  ctUnbind(pSel);.
b860: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b870: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
b880: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
b890: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
b8a0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
b8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
b8c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
b8d0: 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70   from the VIEW p
b8e0: 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Table..**.** Thi
b8f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b900: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79  led whenever any
b910: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20   other table or 
b920: 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64  view is modified
b930: 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61  ..** The view pa
b940: 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
b950: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70  outine might dep
b960: 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20  end directly or 
b970: 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e  indirectly.** on
b980: 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72   the modified or
b990: 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73   deleted table s
b9a0: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  o we need to cle
b9b0: 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d  ar the old colum
b9c0: 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68  n.** names so th
b9d0: 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
b9e0: 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  recomputed..*/.s
b9f0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
ba00: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
ba10: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
ba20: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
ba30: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
ba40: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
ba50: 3d 30 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  =0 && pTable->pS
ba60: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f  elect!=0 );.  fo
ba70: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
ba80: 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  le->aCol; i<pTab
ba90: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
baa0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Col++){.    sqli
bab0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
bac0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
bad0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  ree(pCol->zDflt)
bae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
baf0: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
bb00: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
bb10: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
bb20: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
bb30: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
bb40: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
bb50: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
bb60: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
bb70: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
bb80: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
bb90: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
bba0: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
bbb0: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
bbc0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
bbd0: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
bbe0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
bbf0: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
bc00: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
bc10: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
bc20: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
bc30: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
bc40: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
bc50: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
bc60: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
bc70: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
bc80: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
bc90: 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52       sqliteViewR
bca0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
bcb0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
bcc0: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
bcd0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
bce0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
bcf0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
bd00: 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20  oken, look up a 
bd10: 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20  table with that 
bd20: 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f  name.  If not fo
bd30: 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e  und, leave.** an
bd40: 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70   error for the p
bd50: 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e  arser to find an
bd60: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
bd70: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
bd80: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
bd90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
bda0: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
bdb0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
bdc0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
bdd0: 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  e = sqlite3Table
bde0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
bdf0: 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ok);.  if( zName
be00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
be10: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
be20: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
be30: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  ->db, zName, 0);
be40: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
be50: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
be60: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
be70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
be80: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
be90: 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20  e: %T", pTok);. 
bea0: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
beb0: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
bec0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
bed0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
bee0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
bef0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
bf00: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
bf10: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
bf20: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
bf30: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
bf40: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
bf50: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
bf60: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
bf70: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
bf80: 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
bf90: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
bfa0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62  Vdbe *v;.  int b
bfb0: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ase;.  sqlite *d
bfc0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bfd0: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
bfe0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
bff0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
c000: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
c010: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
c020: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
c030: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
c040: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
c050: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
c060: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
c070: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
c080: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
c090: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
c0a0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
c0b0: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
c0c0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
c0d0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
c0e0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
c0f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
c100: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
c110: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
c120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
c130: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
c140: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
c150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
c160: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
c170: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
c180: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
c190: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
c1a0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
c1b0: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
c1c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c1d0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
c1e0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
c1f0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
c200: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
c210: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
c220: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
c230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
c240: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
c250: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
c260: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c270: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
c280: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
c290: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
c2a0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
c2b0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
c2c0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
c2d0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
c2e0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
c2f0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
c300: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
c310: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
c320: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
c330: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
c340: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
c350: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
c360: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
c370: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
c380: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
c390: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c3a0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
c3b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
c3c0: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
c3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c3e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
c3f0: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
c400: 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
c410: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50  ->zName);.    pP
c420: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
c430: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c440: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
c450: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
c460: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
c470: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c480: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
c490: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
c4a0: 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
c4b0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
c4c0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
c4d0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
c4e0: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
c4f0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
c500: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c510: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
c520: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
c530: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
c540: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
c550: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
c560: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
c570: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
c580: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
c590: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
c5a0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
c5b0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
c5c0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c5d0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
c5e0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
c5f0: 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54 61  dbeOpList dropTa
c600: 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ble[] = {.      
c610: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
c620: 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d   0, ADDR(13), 0}
c630: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
c640: 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20  ing8,    0, 0,  
c650: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
c660: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
c670: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
c680: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
c690: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
c6a0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
c6b0: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
c6c0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
c6d0: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
c6e0: 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  , /* sqlite_mast
c6f0: 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20  er.tbl_name */. 
c700: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
c710: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 32        0, ADDR(12
c720: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
c730: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
c740: 20 30 2c 20 20 20 20 20 20 20 20 22 74 72 69 67   0,        "trig
c750: 67 65 72 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ger"},.      { O
c760: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
c770: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   2,        0}, /
c780: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  * sqlite_master.
c790: 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20  type */.      { 
c7a0: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
c7b0: 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a  , ADDR(12), 0},.
c7c0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
c7d0: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
c7e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
c7f0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
c800: 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a  , ADDR(13), 0},.
c810: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
c820: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
c830: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
c840: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
c850: 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20  , ADDR(3),  0}, 
c860: 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a  /* 12 */.    };.
c870: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c880: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
c890: 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  rigger;.    sqli
c8a0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
c8b0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
c8c0: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20  , pTab->iDb);.. 
c8d0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
c8e0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
c8f0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
c900: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
c910: 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
c920: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
c930: 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
c940: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
c950: 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
c960: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
c970: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
c980: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
c990: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
c9a0: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
c9b0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
c9c0: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
c9d0: 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62  ->iDb==pTab->iDb
c9e0: 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44   || pTrigger->iD
c9f0: 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  b==1 );.      sq
ca00: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
ca10: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
ca20: 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  gger, 1);.      
ca30: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
ca40: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
ca50: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
ca60: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
ca70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ca80: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
ca90: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20  >pTrigger;.     
caa0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
cab0: 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
cac0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
cad0: 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
cae0: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
caf0: 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
cb00: 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
cb10: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
cb20: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
cb30: 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
cb40: 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
cb50: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
cb60: 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
cb70: 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
cb80: 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
cb90: 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
cba0: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
cbb0: 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
cbc0: 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
cbd0: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
cbe0: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
cbf0: 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
cc00: 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
cc10: 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
cc20: 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
cc30: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
cc40: 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2d  erTable(v, pTab-
cc50: 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20  >iDb);.    base 
cc60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cc70: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
cc80: 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20  ize(dropTable), 
cc90: 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  dropTable);.    
cca0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ccb0: 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70  eP3(v, base+1, p
ccc0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
ccd0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
cce0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70  eCookie(db, v, p
ccf0: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73  Tab->iDb);.    s
cd00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cd10: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
cd20: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  0);.    if( !isV
cd30: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
cd40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cd50: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61   OP_Destroy, pTa
cd60: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  b->tnum, pTab->i
cd70: 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  Db);.      for(p
cd80: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
cd90: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
cda0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
cdb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cdc0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
cdd0: 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  y, pIdx->tnum, p
cde0: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  Idx->iDb);.     
cdf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ce00: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
ce10: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
ce20: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
ce30: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65  the in-memory de
ce40: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
ce50: 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
ce60: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
ce70: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
ce80: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
ce90: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
cea0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
ceb0: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
cec0: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
ced0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
cee0: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
cef0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
cf00: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
cf10: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
cf20: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
cf30: 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c  anges;.  }.  sql
cf40: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
cf50: 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
cf60: 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
cf70: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
cf80: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
cf90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cfa0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
cfb0: 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
cfc0: 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
cfd0: 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
cfe0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
cff0: 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
d000: 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
d010: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
d020: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
d030: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
d040: 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
d050: 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
d060: 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
d070: 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
d080: 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
d090: 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
d0a0: 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
d0b0: 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
d0c0: 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
d0d0: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
d0e0: 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
d0f0: 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
d100: 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
d110: 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
d120: 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
d130: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
d140: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
d150: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
d160: 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
d170: 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
d180: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
d190: 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
d1a0: 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
d1b0: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
d1c0: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
d1d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
d1e0: 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
d1f0: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
d200: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
d210: 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
d220: 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
d230: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
d240: 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
d250: 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
d260: 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
d270: 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54  ntil sqlite3EndT
d280: 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
d290: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
d2a0: 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
d2b0: 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
d2c0: 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
d2d0: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
d2e0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
d2f0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
d300: 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
d310: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d320: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
d330: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d340: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
d350: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d360: 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
d370: 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
d380: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
d390: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
d3a0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
d3b0: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
d3c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
d3d0: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
d3e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
d3f0: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
d400: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
d410: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
d420: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
d430: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
d440: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
d450: 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  . */.){.  Table 
d460: 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
d470: 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
d480: 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
d490: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
d4a0: 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b   *z;.  FKey *pFK
d4b0: 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ey = 0;..  asser
d4c0: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
d4d0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
d4e0: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
d4f0: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
d500: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
d510: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
d520: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
d530: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
d540: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
d550: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
d560: 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
d570: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d580: 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
d590: 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
d5a0: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
d5b0: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
d5c0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
d5d0: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
d5e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
d5f0: 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
d600: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
d610: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
d620: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
d630: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
d640: 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
d650: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
d660: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d670: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
d680: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
d690: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
d6a0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
d6b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
d6c0: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
d6d0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
d6e0: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
d6f0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
d700: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
d710: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
d720: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
d730: 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e  zeof(*pFKey) + n
d740: 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  Col*sizeof(pFKey
d750: 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
d760: 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
d770: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
d780: 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
d790: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d7a0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
d7b0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
d7c0: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
d7d0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
d7e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
d7f0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
d800: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
d810: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
d820: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
d830: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
d840: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
d850: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
d860: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
d870: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
d880: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
d890: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
d8a0: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
d8b0: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
d8c0: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
d8d0: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
d8e0: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
d8f0: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
d900: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
d910: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
d920: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
d930: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
d940: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
d950: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
d960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
d970: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
d980: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
d990: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
d9a0: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
d9b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
d9c0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
d9d0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
d9e0: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
d9f0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
da00: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
da10: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
da20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
da30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da40: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
da50: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
da60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
da70: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
da80: 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
da90: 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
daa0: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
dab0: 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
dac0: 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
dad0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
dae0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
daf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
db00: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
db10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
db20: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
db30: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
db40: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
db50: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
db60: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
db70: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
db80: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
db90: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
dba0: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
dbb0: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
dbc0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
dbd0: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
dbe0: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
dbf0: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
dc00: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
dc10: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
dc20: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
dc30: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
dc40: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
dc50: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
dc60: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
dc70: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
dc80: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
dc90: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
dca0: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
dcb0: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
dcc0: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
dcd0: 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69  e(pFKey);.  sqli
dce0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dcf0: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
dd00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
dd10: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
dd20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
dd30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
dd40: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
dd50: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
dd60: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
dd70: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
dd80: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
dd90: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
dda0: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
ddb0: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
ddc0: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
ddd0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
dde0: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
ddf0: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
de00: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
de10: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
de20: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
de30: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
de40: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
de50: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
de60: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
de70: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
de80: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
de90: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
dea0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
deb0: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
dec0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ded0: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
dee0: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
def0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
df00: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
df10: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a   isDeferred;.}..
df20: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
df30: 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
df40: 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64  SQL table.  pInd
df50: 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ex is the name o
df60: 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
df70: 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68  and pTable is th
df80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
df90: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
dfa0: 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
dfb0: 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
dfc0: 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
dfd0: 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
dfe0: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
dff0: 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
e000: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
e010: 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
e020: 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
e030: 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
e040: 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
e050: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
e060: 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
e070: 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
e080: 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
e090: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
e0a0: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
e0b0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e0c0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
e0d0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
e0e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
e0f0: 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
e100: 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
e110: 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
e120: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
e130: 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
e140: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
e150: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
e160: 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
e170: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
e180: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
e190: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
e1a0: 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
e1b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
e1c0: 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
e1d0: 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
e1e0: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
e1f0: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
e200: 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
e210: 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
e220: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
e230: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
e240: 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
e250: 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
e260: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
e270: 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62  TblName,  /* Tab
e280: 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
e290: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e2a0: 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
e2b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e2c0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
e2d0: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
e2e0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
e2f0: 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
e300: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
e310: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
e320: 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
e330: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
e340: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
e350: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
e360: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e370: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
e380: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
e390: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
e3a0: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
e3b0: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
e3c0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
e3d0: 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65  ab = 0; /* Table
e3e0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
e3f0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
e400: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
e410: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
e420: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
e430: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
e440: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
e450: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
e460: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
e470: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
e480: 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
e490: 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
e4a0: 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
e4b0: 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
e4c0: 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a   isTemp;      /*
e4d0: 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70   True for a temp
e4e0: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
e4f0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
e500: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74  arse->db;..  int
e510: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f   iDb;          /
e520: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
e530: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
e540: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
e550: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
e560: 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66  = 0; /* Unqualif
e570: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
e580: 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
e590: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
e5a0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
e5b0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
e5c0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
e5d0: 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
e5e0: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
e5f0: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
e600: 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
e610: 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
e620: 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
e630: 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
e640: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
e650: 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
e660: 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
e670: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
e680: 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
e690: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
e6a0: 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
e6b0: 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
e6c0: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
e6d0: 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
e6e0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
e6f0: 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
e700: 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
e710: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
e720: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
e730: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
e740: 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
e750: 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
e760: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
e770: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
e780: 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
e790: 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
e7a0: 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
e7b0: 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
e7c0: 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
e7d0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
e7e0: 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a  se to 1..    */.
e7f0: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
e800: 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
e810: 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
e820: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65  );.    if( pName
e830: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d  2 && pName2->n==
e840: 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
e850: 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  b->iDb==1 ){.   
e860: 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
e870: 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
e880: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
e890: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
e8a0: 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
e8b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e8c0: 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
e8d0: 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
e8e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e8f0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
e900: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
e910: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
e920: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
e930: 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
e940: 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
e950: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
e960: 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
e970: 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
e980: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
e990: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
e9a0: 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d  pTab->iDb );.  }
e9b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
e9c0: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
e9d0: 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65    pTab =  pParse
e9e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
e9f0: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
ea00: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61  ;.  }..  if( pTa
ea10: 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
ea20: 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
ea30: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
ea40: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
ea50: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
ea60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ea70: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
ea80: 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
ea90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
eaa0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
eab0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
eac0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
ead0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
eae0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
eaf0: 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
eb00: 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
eb10: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
eb20: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
eb30: 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d    isTemp = pTab-
eb40: 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20  >iDb==1;..  /*. 
eb50: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
eb60: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
eb70: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
eb80: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
eb90: 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
eba0: 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
ebb0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
ebc0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
ebd0: 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
ebe0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
ebf0: 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
ec00: 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
ec10: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
ec20: 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
ec30: 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
ec40: 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
ec50: 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
ec60: 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
ec70: 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
ec80: 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
ec90: 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
eca0: 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
ecb0: 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
ecc0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
ecd0: 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
ece0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
ecf0: 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
ed00: 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
ed10: 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
ed20: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
ed30: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
ed40: 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
ed50: 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
ed60: 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
ed70: 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21 64   if( pName && !d
ed80: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
ed90: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d      Index *pISam
eda0: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f  eName;    /* Ano
edb0: 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20  ther index with 
edc0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f  the same name */
edd0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61  .    Table *pTSa
ede0: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20  meName;    /* A 
edf0: 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20  table with same 
ee00: 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65  name as the inde
ee10: 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  x */.    zName =
ee20: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
ee30: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
ee40: 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
ee50: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
ee60: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
ee70: 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
ee80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
ee90: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
eea0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
eeb0: 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
eec0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
eed0: 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
eee0: 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
eef0: 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
ef00: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
ef10: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
ef20: 0a 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65  .    if( (pTSame
ef30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Name = sqlite3Fi
ef40: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
ef50: 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
ef60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ef70: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
ef80: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
ef90: 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
efa0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
efb0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
efc0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
efd0: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
efe0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
eff0: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
f000: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
f010: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
f020: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
f030: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
f040: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
f050: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
f060: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
f070: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
f080: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
f090: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28  tring(&zName, "(
f0a0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
f0b0: 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a  " autoindex ", z
f0c0: 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
f0d0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
f0e0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
f0f0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c  ate_index;.  }el
f100: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
f110: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
f120: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
f130: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
f140: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
f150: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
f160: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
f170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f180: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f190: 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
f1a0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
f1b0: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
f1c0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
f1d0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f1e0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
f1f0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
f200: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
f210: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f220: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f230: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
f240: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
f250: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73  NDEX;.    if( is
f260: 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54  Temp ) i = SQLIT
f270: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
f280: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
f290: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
f2a0: 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
f2b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
f2c0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f2d0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f2e0: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
f2f0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
f300: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
f310: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
f320: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
f330: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
f340: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
f350: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
f360: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
f370: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
f380: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
f390: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
f3a0: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
f3b0: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
f3c0: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
f3d0: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
f3e0: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
f3f0: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
f400: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
f410: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
f420: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f430: 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
f440: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
f450: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
f460: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
f470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
f480: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
f490: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
f4a0: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
f4b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f4c0: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
f4d0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
f4e0: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
f4f0: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
f500: 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
f510: 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73  (CollSeq*))*pLis
f520: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66  t->nExpr );.  if
f530: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f  ( pIndex==0 ) go
f540: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
f550: 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
f560: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
f570: 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
f580: 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e  o.aColl[pList->n
f590: 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  Expr];.  pIndex-
f5a0: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
f5b0: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
f5c0: 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  n[pList->nExpr];
f5d0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
f5e0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
f5f0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
f600: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
f610: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
f620: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
f630: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
f640: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
f650: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
f660: 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
f670: 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20  x->iDb = iDb;.. 
f680: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
f690: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
f6a0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
f6b0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
f6c0: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
f6d0: 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
f6e0: 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
f6f0: 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
f700: 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
f710: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
f720: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
f730: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
f740: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
f750: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
f760: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
f770: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f780: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
f790: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
f7a0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
f7b0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
f7c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
f7d0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
f7e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f7f0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
f800: 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
f810: 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
f820: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
f830: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  e, pList->a[i].z
f840: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
f850: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
f860: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f870: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f880: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
f890: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
f8a0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
f8b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
f8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
f8d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
f8e0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
f8f0: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
f900: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
f910: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
f920: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
f930: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
f940: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
f950: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
f960: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
f970: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
f980: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
f990: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
f9a0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
f9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
f9c0: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
f9d0: 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
f9e0: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
f9f0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
fa00: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
fa10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
fa20: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
fa30: 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
fa40: 78 70 72 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xpr;..  /* Link 
fa50: 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
fa60: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
fa70: 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
fa80: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
fa90: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
faa0: 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
fab0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
fac0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e  xplain ){.    In
fad0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
fae0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
faf0: 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  t(&db->aDb[pInde
fb00: 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  x->iDb].idxHash,
fb10: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
fb20: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
fb30: 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
fb40: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
fb50: 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
fb60: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
fb70: 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
fb80: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
fb90: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
fba0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
fbb0: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
fbc0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
fbd0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
fbe0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
fbf0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
fc00: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
fc10: 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
fc20: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
fc30: 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
fc40: 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
fc50: 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
fc60: 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
fc70: 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
fc80: 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
fc90: 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
fca0: 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
fcb0: 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
fcc0: 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
fcd0: 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
fce0: 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
fcf0: 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  */.  if( onError
fd00: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
fd10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
fd20: 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
fd30: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
fd40: 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
fd50: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
fd60: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
fd70: 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
fd80: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c   = pIndex;.  }el
fd90: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
fda0: 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
fdb0: 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28  ndex;.    while(
fdc0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
fdd0: 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
fde0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
fdf0: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f  lace ){.      pO
fe00: 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
fe10: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
fe20: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
fe30: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
fe40: 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
fe50: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a   = pIndex;.  }..
fe60: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
fe70: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
fe80: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
fe90: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
fea0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
feb0: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
fec0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
fed0: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
fee0: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
fef0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
ff00: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
ff10: 72 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  r from the db->i
ff20: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
ff30: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  d..  */.  if( db
ff40: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
ff50: 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
ff60: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
ff70: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ff80: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
ff90: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
ffa0: 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
ffb0: 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
ffc0: 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
ffd0: 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
ffe0: 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
fff0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
10000 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
10010 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
10020 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
10030 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
10040 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
10050 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
10060 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
10070 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
10080 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
10090 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
100a0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
100b0 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
100c0 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
100d0 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
100e0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
100f0 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
10100 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
10110 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
10120 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
10130 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
10140 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
10150 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
10160 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
10170 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
10180 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
10190 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
101a0 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
101b0 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
101c0 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
101d0 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
101e0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
101f0 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
10200 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
10210 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
10220 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
10230 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
10240 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
10250 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
10260 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
10270 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
10280 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
10290 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  =0 ){.    int n;
102a0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
102b0 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32    int lbl1, lbl2
102c0 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
102d0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
102e0 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
102f0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10300 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
10310 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
10320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
10330 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
10340 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
10350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10360 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
10370 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  v, iDb);.    }. 
10380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10390 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
103a0 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
103b0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
103c0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
103d0 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53  0, "index", P3_S
103e0 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
103f0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10400 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
10410 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
10420 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10430 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
10440 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  ng8, 0, 0, pTab-
10450 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
10460 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10470 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
10480 2c 20 30 2c 20 69 44 62 2c 28 63 68 61 72 2a 29  , 0, iDb,(char*)
10490 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33  &pIndex->tnum,P3
104a0 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70  _POINTER);.    p
104b0 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b  Index->tnum = 0;
104c0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
104d0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
104e0 65 33 56 64 62 65 43 6f 64 65 28 76 2c 0a 20 20  e3VdbeCode(v,.  
104f0 20 20 20 20 20 20 20 20 4f 50 5f 44 75 70 2c 20          OP_Dup, 
10500 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 30 2c        0,      0,
10510 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f 49 6e  .          OP_In
10520 74 65 67 65 72 2c 20 20 20 69 44 62 2c 20 20 20  teger,   iDb,   
10530 20 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a 20 20   0,.      0);.  
10540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
10550 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
10560 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20  te, 1, 0,.      
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10580 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  char*)&pIndex->k
10590 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
105a0 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  FO);.    }.    s
105b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
105c0 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
105d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
105e0 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
105f0 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f        if( onErro
10600 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r==OE_None ){.  
10610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10620 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
10630 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 22   "CREATE INDEX "
10640 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10670 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43  angeP3(v, -1, "C
10680 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
10690 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EX ", P3_STATIC)
106a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
106b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
106c0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
106d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d  0, 0);.      n =
106e0 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
106f0 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20   Addr(pName->z) 
10700 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
10710 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
10720 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  , -1, pName->z, 
10730 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
10740 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10750 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a  _Concat, 2, 0);.
10760 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10770 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
10780 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c  akeRecord, 5, 0,
10790 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41   "tttit", P3_STA
107a0 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
107b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
107c0 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
107d0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  );.    if( pTblN
107e0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
107f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10800 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
10810 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  b->iDb, 0);.    
10820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10830 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
10840 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  d, 2, pTab->tnum
10850 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64 62 65  );.      /* Vdbe
10860 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
10870 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
10880 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10890 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
108a0 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
108b0 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  2, pTab->nCol);.
108c0 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c        lbl2 = sql
108d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
108e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
108f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10900 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62  OP_Rewind, 2, lb
10910 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20  l2);.      lbl1 
10920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10930 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
10940 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
10950 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49  teIndexKey(v, pI
10960 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20 20 20 20  ndex, 2);.      
10970 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10980 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20  , OP_IdxPut, 1, 
10990 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
109a0 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20  =OE_None,.      
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
109d0 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
109e0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
109f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10a00 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
10a10 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20   2, lbl1);.     
10a20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10a30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32  lveLabel(v, lbl2
10a40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a60 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20  Close, 2, 0);.  
10a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10a80 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10a90 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
10aa0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
10ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
10ac0 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
10ad0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
10ae0 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
10af0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
10b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10b10 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
10b20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
10b30 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
10b40 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
10b50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
10b60 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
10b70 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
10b80 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73  reate_index:.  s
10b90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10ba0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 2f  lete(pList);.  /
10bb0 2a 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  * sqlite3SrcList
10bc0 44 65 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 20  Delete(pTable); 
10bd0 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  */.  sqliteFree(
10be0 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
10bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10c00 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
10c10 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
10c20 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
10c30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
10c40 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
10c50 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
10c60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10c70 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
10c80 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
10c90 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
10ca0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
10cb0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
10cc0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10cd0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
10ce0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
10cf0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
10d00 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
10d10 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
10d20 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   );.  pIndex = s
10d30 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
10d40 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
10d50 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
10d60 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
10d70 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
10d80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
10da0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
10db0 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
10dc0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
10dd0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
10de0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
10df0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
10e00 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
10e10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10e20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10e30 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
10e40 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
10e50 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
10e60 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
10e70 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
10e80 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
10e90 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
10ea0 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28 20  x;.  }./*.  if( 
10eb0 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b  pIndex->iDb>1 ){
10ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10ed0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
10ee0 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d  nnot alter schem
10ef0 61 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a  a of attached ".
10f00 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
10f10 73 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  s", 0);.    goto
10f20 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
10f30 3b 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64 65 66  ;.  }.*/.#ifndef
10f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10f50 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
10f60 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
10f70 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
10f80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
10f90 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
10fa0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
10fb0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
10fc0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
10fd0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
10fe0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
10ff0 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
11000 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  >iDb);.    if( s
11010 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11020 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
11030 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
11040 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
11050 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
11060 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
11070 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20  ( pIndex->iDb ) 
11080 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
11090 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
110a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
110b0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
110c0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
110d0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
110e0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
110f0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11100 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
11110 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
11120 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
11130 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
11140 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
11150 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
11160 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11170 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11180 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
11190 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49  VdbeOpList dropI
111a0 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
111b0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
111c0 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
111d0 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
111e0 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 30 2c  ring8,     0, 0,
111f0 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20         0}, /* 1 
11200 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
11210 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
11220 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11230 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
11240 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   1, 0,       0},
11250 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
11260 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
11270 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 1,       0},.
11280 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20        { OP_Eq,  
11290 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38         0, ADDR(8
112a0 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
112b0 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
112c0 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20   ADDR(3), 0},.  
112d0 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
112e0 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
112f0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11300 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
11310 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38  ,       0}, /* 8
11320 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
11330 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71  nt base;..    sq
11340 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
11350 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
11360 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29   0, pIndex->iDb)
11370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  ;.    sqlite3Ope
11380 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
11390 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
113a0 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33    base = sqlite3
113b0 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
113c0 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
113d0 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
113e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
113f0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
11400 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+1, pIndex->zN
11410 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
11420 20 70 49 6e 64 65 78 2d 3e 69 44 62 21 3d 31 20   pIndex->iDb!=1 
11430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11440 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
11450 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29   v, pIndex->iDb)
11460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11470 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11480 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
11490 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
114a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
114b0 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
114c0 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  m, pIndex->iDb);
114d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57  .    sqlite3EndW
114e0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
114f0 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
11500 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d   Delete the in-m
11510 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f  emory descriptio
11520 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  n of this index.
11530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
11540 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
11550 20 20 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e      sqlite3Unlin
11560 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
11570 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  db, pIndex);.   
11580 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
11590 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
115a0 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  es;.  }..exit_dr
115b0 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
115c0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
115d0 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
115e0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
115f0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
11600 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
11610 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
11620 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
11630 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
11640 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
11650 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
11660 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
11670 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
11680 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
11690 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
116a0 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
116b0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
116c0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
116d0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
116e0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
116f0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
11700 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
11710 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
11720 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e   if( pList->nId>
11730 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
11740 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
11750 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
11760 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
11770 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
11780 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 5;.    a = sq
11790 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
117a0 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c  t->a, pList->nAl
117b0 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  loc*sizeof(pList
117c0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
117d0 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
117e0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
117f0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
11800 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
11810 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
11820 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  = a;.  }.  memse
11830 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
11840 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65  t->nId], 0, size
11850 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
11860 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
11870 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
11880 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
11890 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->nId].zName;. 
118a0 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
118b0 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d  ring(pz, pToken-
118c0 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30  >z, pToken->n, 0
118d0 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
118e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
118f0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
11900 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
11910 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
11920 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11930 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
11940 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
11950 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  nId++;.  return 
11960 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
11970 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
11980 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
11990 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
119a0 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
119b0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
119c0 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
119d0 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
119e0 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
119f0 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
11a00 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72  ..**.** A new Sr
11a10 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
11a20 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
11a30 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a  lloc() fails..**
11a40 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
11a50 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
11a60 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
11a70 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
11a80 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
11a90 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
11aa0 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
11ab0 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
11ac0 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
11ad0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
11ae0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
11af0 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
11b00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
11b10 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
11b20 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
11b30 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
11b40 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
11b50 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
11b60 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
11b70 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
11b80 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
11b90 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
11ba0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
11bb0 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
11bc0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
11bd0 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
11be0 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
11bf0 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
11c00 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
11c10 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
11c20 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
11c30 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
11c40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11c50 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
11c60 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
11c70 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
11c80 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
11c90 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
11ca0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
11cb0 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
11cc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
11cd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
11ce0 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  pend(A,B,C);.**.
11cf0 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
11d00 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
11d10 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
11d20 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69  e name..*/.SrcLi
11d30 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
11d40 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74  stAppend(SrcList
11d50 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
11d60 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70  pTable, Token *p
11d70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28  Database){.  if(
11d80 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
11d90 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
11da0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
11db0 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
11dc0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
11dd0 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
11de0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
11df0 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
11e00 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  Src>=pList->nAll
11e10 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
11e20 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69  t *pNew;.    pLi
11e30 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
11e40 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
11e50 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
11e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11e70 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
11e80 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d   (pList->nAlloc-
11e90 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  1)*sizeof(pList-
11ea0 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
11eb0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
11ec0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
11ed0 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
11ee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11ef0 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
11f00 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65  = pNew;.  }.  me
11f10 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
11f20 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20  List->nSrc], 0, 
11f30 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
11f40 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
11f50 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
11f60 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
11f70 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
11f80 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
11f90 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
11fa0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
11fb0 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
11fc0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
11fd0 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
11fe0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
11ff0 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
12000 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
12010 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
12020 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Src].zName;.    
12030 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
12040 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c  g(pz, pTable->z,
12050 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a   pTable->n, 0);.
12060 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29      if( *pz==0 )
12070 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
12080 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
12090 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
120a0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
120b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
120c0 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
120d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
120e0 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72  base ){.    char
120f0 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
12100 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
12110 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71  Database;.    sq
12120 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
12130 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a  pz, pDatabase->z
12140 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20  , pDatabase->n, 
12150 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
12160 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12170 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
12180 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
12190 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
121a0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
121b0 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  3Dequote(*pz);. 
121c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
121d0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
121e0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
121f0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
12200 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
12210 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
12220 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74  cursors to all t
12230 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
12240 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
12250 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
12260 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
12270 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
12280 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
12290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
122a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
122b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
122c0 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b  [i].iCursor<0 ){
122d0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
122e0 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  i].iCursor = pPa
122f0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
12300 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12310 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20  Add an alias to 
12320 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66  the last identif
12330 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ier on the given
12340 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74   identifier list
12350 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12360 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  3SrcListAddAlias
12370 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
12380 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
12390 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
123a0 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  pList->nSrc>0 ){
123b0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  .    int i = pLi
123c0 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20  st->nSrc - 1;.  
123d0 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
123e0 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d  ing(&pList->a[i]
123f0 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d  .zAlias, pToken-
12400 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30  >z, pToken->n, 0
12410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
12420 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
12430 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d  ].zAlias);.  }.}
12440 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
12450 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
12460 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
12470 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c  elete(IdList *pL
12480 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
12490 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
124a0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
124b0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
124c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
124d0 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
124e0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
124f0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
12500 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
12510 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
12520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
12530 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
12540 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
12550 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
12560 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
12570 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
12580 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
12590 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
125a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
125b0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
125c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
125d0 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
125e0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
125f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12600 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
12610 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
12620 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
12630 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
12640 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
12650 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
12660 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
12670 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
12680 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
12690 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
126a0 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
126b0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
126c0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
126d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
126e0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
126f0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
12700 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
12710 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[i].zDatabase)
12720 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12730 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
12740 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
12750 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
12760 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
12770 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
12780 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  b && pList->a[i]
12790 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  .pTab->isTransie
127a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
127b0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
127c0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  , pList->a[i].pT
127d0 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
127e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
127f0 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
12800 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
12810 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
12820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  List->a[i].pOn);
12830 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
12840 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  stDelete(pList->
12850 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  a[i].pUsing);.  
12860 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
12870 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
12880 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
12890 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
128a0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
128b0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
128c0 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
128d0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
128e0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
128f0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
12900 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
12910 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
12920 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
12930 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
12940 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
12950 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
12960 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12970 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
12980 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
12990 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
129a0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
129b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
129c0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
129d0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
129e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
129f0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
12a00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
12a10 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
12a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12a30 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
12a40 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
12a50 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
12a60 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
12a70 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
12a80 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
12a90 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
12aa0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
12ab0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12ac0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
12ad0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
12ae0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
12af0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
12b00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
12b10 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
12b20 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
12b30 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
12b40 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12b50 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
12b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b70 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
12b80 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
12b90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
12ba0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
12bb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
12bc0 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
12bd0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
12be0 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
12bf0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
12c00 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
12c10 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
12c20 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
12c30 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
12c40 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
12c50 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
12c60 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
12c70 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
12c80 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12c90 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
12ca0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
12cb0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
12cc0 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
12cd0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12ce0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
12cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12d00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
12d10 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
12d20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12d30 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
12d40 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20  hat will verify 
12d50 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
12d60 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61  e and start.** a
12d70 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
12d80 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20  n for all named 
12d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
12da0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f  **.** It is impo
12db0 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73  rtant that all s
12dc0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65  chema cookies be
12dd0 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c   verified and al
12de0 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61  l.** read transa
12df0 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65  ctions be starte
12e00 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e  d before anythin
12e10 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69  g else happens i
12e20 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72  n.** the VDBE pr
12e30 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73  ogram.  But this
12e40 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
12e50 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63  called after muc
12e60 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20  h other.** code 
12e70 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74  has been generat
12e80 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20  ed.  So here is 
12e90 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a  what we do:.**.*
12ea0 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
12eb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12ec0 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65   called, we code
12ed0 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 68 61   an OP_Gosub tha
12ee0 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74  t.** will jump t
12ef0 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61  o a subroutine a
12f00 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
12f10 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20   program.  Then 
12f20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65  we.** record eve
12f30 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
12f40 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d   needs its schem
12f50 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68  a verified in th
12f60 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e.** pParse->coo
12f70 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20  kieMask field.  
12f80 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c  Later, after all
12f90 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
12fa0 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65  been.** generate
12fb0 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  d, the subroutin
12fc0 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20  e that does the 
12fd0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
12fe0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72  ions and.** star
12ff0 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
13000 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65  ons will be code
13010 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 73  d and the OP_Gos
13020 75 62 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  ub P2 value.** w
13030 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
13040 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
13050 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
13060 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
13070 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
13080 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
13090 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
130a0 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
130b0 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
130c0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
130d0 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
130e0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
130f0 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
13100 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
13110 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71   mask;..  v = sq
13120 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13130 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
13140 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
13150 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
13160 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20   if there was a 
13170 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  prior error */. 
13180 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
13190 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
131a0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
131b0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
131c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
131d0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
131e0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32    assert( iDb<32
131f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
13200 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 3d 3d 30 20  ->cookieMask==0 
13210 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
13220 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
13230 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13240 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
13250 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c    }.  mask = 1<<
13260 69 44 62 3b 0a 20 20 69 66 28 20 28 70 50 61 72  iDb;.  if( (pPar
13270 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
13280 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
13290 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
132a0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
132b0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56   pParse->cookieV
132c0 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
132d0 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f  aDb[iDb].schema_
132e0 63 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  cookie;.  }.}../
132f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
13300 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
13310 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
13320 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
13330 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
13340 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
13350 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13360 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
13370 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
13380 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
13390 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
133a0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
133b0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
133c0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
133d0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
133e0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
133f0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
13400 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
13410 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
13420 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
13430 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
13440 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
13450 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
13460 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
13470 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
13480 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
13490 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
134a0 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
134b0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
134c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
134d0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
134e0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
134f0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
13500 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
13510 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
13520 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
13530 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
13540 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
13550 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
13560 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
13570 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
13580 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
13590 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
135a0 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
135b0 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
135c0 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
135d0 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
135e0 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
135f0 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
13600 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
13610 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
13620 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
13630 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
13640 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
13650 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
13660 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
13670 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
13680 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
13690 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
136a0 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
136b0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
136c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
136d0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
136e0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
136f0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
13700 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
13710 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
13720 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13730 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
13740 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
13750 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
13760 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13770 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
13780 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
13790 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
137a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
137b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
137c0 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30  tatement, iDb, 0
137d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
137e0 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
137f0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
13800 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
13810 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
13820 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
13830 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
13840 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65  concludes an ope
13850 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ration that may 
13860 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  have changed.** 
13870 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
13880 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
13890 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
138a0 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74  arted, then emit
138b0 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74  .** an OP_Commit
138c0 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65   that will cause
138d0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
138e0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  be committed to 
138f0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  disk..**.** Note
13900 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74   that checkpoint
13910 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
13920 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74  lly committed at
13930 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61   the end of.** a
13940 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74   statement.  Not
13950 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72  e also that ther
13960 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c  e can be multipl
13970 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  e calls to .** s
13980 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
13990 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20  Operation() but 
139a0 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  there should onl
139b0 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  y be a single.**
139c0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
139d0 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
139e0 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  n() at the concl
139f0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  usion of the sta
13a00 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
13a10 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
13a20 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
13a30 70 50 61 72 73 65 29 7b 0a 20 20 2f 2a 20 44 65  pParse){.  /* De
13a40 6c 65 74 65 20 6d 65 21 20 2a 2f 0a 20 20 72 65  lete me! */.  re
13a50 74 75 72 6e 3b 0a 7d 0a                          turn;.}.