/ Hex Artifact Content
Login

Artifact b36b62f49aea7d258cb804999dcc8650e4d79464:


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 36 20 32 30 30 34 2f 30 36 2f 31 30 20 31  216 2004/06/10 1
0300: 34 3a 30 31 3a 30 38 20 64 61 6e 69 65 6c 6b 31  4:01:08 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 23 69 66 20 30 0a 20 20 69 66 28 28 64 62 2d 3e  #if 0.  if((db->
04c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
04d0: 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 26  nitialized)==0 &
04e0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
04f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
0500: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
0510: 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  b, &pParse->zErr
0520: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
0530: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0540: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0550: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72  = rc;.      pPar
0560: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0570: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  }.  }.#endif.  f
0580: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0590: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 43  b; i++){.    DbC
05a0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
05b0: 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a   i, DB_Locked);.
05c0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62      if( !db->aDb
05d0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  [i].inTrans ){. 
05e0: 20 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70       DbClearProp
05f0: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 43  erty(db, i, DB_C
0600: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ookie);.    }.  
0610: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  }.  pParse->nVar
0620: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
0630: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0640: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0650: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0660: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0670: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0680: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0690: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
06a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
06b0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
06c0: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
06d0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
06e0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
06f0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0700: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0710: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0720: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0730: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0740: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0750: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0760: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0770: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0780: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
07a0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
07b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
07c0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
07d0: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
07e0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
07f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0800: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0810: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0820: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0830: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0840: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0850: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
0860: 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
0870: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0880: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
0890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
08a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  ddOp(v, OP_Halt,
08b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
08c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
08d0: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  sk!=0 ){.      u
08e0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08f0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
0900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0910: 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  2(v, pParse->coo
0920: 6b 69 65 47 6f 74 6f 2c 20 73 71 6c 69 74 65 33  kieGoto, sqlite3
0930: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
0940: 76 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  v));.      for(i
0950: 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44  Db=0, mask=1; iD
0960: 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c  b<db->nDb; mask<
0970: 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20  <=1, iDb++){.   
0980: 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26       if( (mask &
0990: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
09a0: 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ask)==0 ) contin
09b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
09c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
09d0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
09e0: 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61  iDb, (mask & pPa
09f0: 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21  rse->writeMask)!
0a00: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
0a10: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
0a40: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70  fyCookie, iDb, p
0a50: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
0a60: 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20  ue[iDb]);.      
0a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a90: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0aa0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0ab0: 47 6f 74 6f 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Goto+1);.    }. 
0ac0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
0ad0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0ae0: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0af0: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0b00: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0b10: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0b20: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0b30: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0b40: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0b50: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0b60: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0b70: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0b80: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0b90: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0ba0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0bb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0bc0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0bd0: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0be0: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0bf0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0c00: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0c10: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0c30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0c40: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0c50: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0c60: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0c70: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0c80: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0c90: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0ca0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0cb0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0cc0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ce0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0cf0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d00: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0d10: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0d20: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0d30: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0d40: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0d50: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0d60: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0d70: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0d80: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0d90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0da0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0db0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0dc0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0dd0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0de0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0df0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0e00: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0e10: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0e20: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0e30: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0e40: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0e50: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0e60: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0e70: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0e80: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0e90: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0ea0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0eb0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0ec0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
0ed0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
0ee0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
0ef0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
0f00: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
0f10: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
0f20: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
0f30: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
0f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 61 64  rc = sqlite3Read
0f60: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
0f70: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
0f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
0f90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0fa0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0fb0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0fc0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0fd0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0fe0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0ff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1000: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1010: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1030: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1040: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1050: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1060: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1070: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
10a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
10b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
10c0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
10d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
10e0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
10f0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
1100: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1110: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1120: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1130: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
1140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1150: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1160: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
1170: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1180: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1190: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
11a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
11b0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
11c0: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
11d0: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
11e0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
11f0: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1200: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1210: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
1220: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
1230: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1240: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
1250: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1260: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1280: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1290: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
12a0: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
12b0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
12c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
12d0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
12e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
12f0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
1300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1310: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1320: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1330: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1340: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1350: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1360: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1370: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1380: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1390: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
13a0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
13b0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
13c0: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
13d0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
13e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1400: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1410: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1420: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1430: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1440: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1450: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
14a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
14b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
14c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
14d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
14e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
14f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
15a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
15b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
15c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
15d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
15e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
15f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1640: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
1650: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1670: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1680: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1690: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
16a0: 61 64 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  adSchema(db, 0);
16b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
16c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
16d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16e0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
16f0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
1700: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
1710: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
1720: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
1730: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1740: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1760: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1770: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69  nd(&db->aDb[j].i
1780: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1790: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
17a0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
17b0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
17c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   p;.}../*.** Rem
17d0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
17e0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
17f0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
1800: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
1810: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
1820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1830: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1840: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1850: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1860: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1870: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1880: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1890: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
18a0: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
18b0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
18c0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
18d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
18e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
18f0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
1900: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1910: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20   Index *pOld;.. 
1920: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26   assert( db!=0 &
1930: 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  & p->zName!=0 );
1940: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
1950: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
1960: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
1970: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
19a0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
19b0: 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20  ;.  if( pOld!=0 
19c0: 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20  && pOld!=p ){.  
19d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
19e0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
19f0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f  iDb].idxHash, pO
1a00: 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ld->zName,.     
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61  strlen(pOld->zNa
1a30: 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20  me)+1, pOld);.  
1a40: 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41  }.  if( p->zColA
1a50: 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
1a60: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1a70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1a80: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1a90: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1aa0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
1ab0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
1ac0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
1ad0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1ae0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1af0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1b00: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
1b20: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1b30: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1b40: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1b50: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
1b60: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
1b70: 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  x ){.    pIndex-
1b80: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1b90: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
1bb0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  dex *p;.    for(
1bc0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
1bd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
1be0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
1bf0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
1c00: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
1c10: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
1c20: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
1c30: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c50: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1c60: 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  , pIndex);.}../*
1c70: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
1c80: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
1c90: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
1ca0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1cb0: 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  of.** database c
1cc0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
1cd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ce0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
1cf0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
1d00: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  he connection cl
1d10: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
1d20: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
1d30: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
1d40: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
1d50: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
1d60: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1d70: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  n..**.** If iDb<
1d80: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
1d90: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
1da0: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
1db0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dc0: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74  es.  If iDb>=2 t
1dd0: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
1de0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
1df0: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
1e00: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
1e10: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1e20: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
1e30: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e40: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e50: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e60: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e70: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1e80: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1e90: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ea0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1eb0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ec0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ed0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1ee0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1ef0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f00: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f10: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f20: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f30: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f40: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
1f50: 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73  it(&pDb->trigHas
1f60: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
1f70: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
1f80: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
1f90: 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20  &pDb->aFKey);.  
1fa0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
1fb0: 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68  ar(&pDb->idxHash
1fc0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
1fd0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1fe0: 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b  (&temp2); pElem;
1ff0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2000: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2010: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54       Trigger *pT
2020: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48  rigger = sqliteH
2030: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
2050: 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67  eteTrigger(pTrig
2060: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
2070: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2080: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
2090: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
20a0: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  Db->tblHash, SQL
20b0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
20c0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c   0);.    for(pEl
20d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
20e0: 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65  st(&temp1); pEle
20f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2100: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2110: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2120: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
2130: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2140: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2150: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2160: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2170: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2180: 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50  1);.    DbClearP
2190: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
21a0: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b  B_SchemaLoaded);
21b0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
21c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
21d0: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
21e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
21f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2200: 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  anges;..  /* If 
2210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
2220: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2230: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
2240: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
2250: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
2260: 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  en from the auxi
2270: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
2280: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
2290: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
22a0: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
22b0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
22c0: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
22d0: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
22e0: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
22f0: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
2300: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
2310: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
2320: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
2330: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2340: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
2350: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2360: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2370: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2380: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
23a0: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
23b0: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
23c0: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
23d0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
23e0: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
23f0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
2400: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
2410: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
2420: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2430: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
2440: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
2450: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44     sqliteFree(pD
2460: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2470: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
2480: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2490: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
24a0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
24b0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
24c0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
24d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
24e0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
24f0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
2500: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
2510: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
2520: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
2530: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
2540: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
2550: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
2560: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
2570: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
2580: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
2590: 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29  iteFree(db->aDb)
25a0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
25b0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
25c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
25d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25e0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
25f0: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20  llback occurs.  
2600: 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a  If there were.**
2610: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2620: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
2630: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20  action, then we 
2640: 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68  have to reset th
2650: 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61  e.** internal ha
2660: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65  sh tables and re
2670: 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64  load them from d
2680: 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  isk..*/.void sql
2690: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  ite3RollbackInte
26a0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
26b0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
26c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
26d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
26e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
26f0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2700: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
2710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2720: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2730: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
2740: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
2750: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
2760: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2770: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
2780: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
2790: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
27a0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
27b0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
27c0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
27d0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
27e0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
27f0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2800: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2810: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2820: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2830: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2840: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
2850: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
2860: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
2870: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
2880: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
2890: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
28a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
28b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
28c0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
28d0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
28e0: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
28f0: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2900: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2910: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2920: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2930: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2940: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
2950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2960: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
2970: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
2980: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2990: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
29a0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
29b0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
29c0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
29d0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
29e0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
29f0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2a00: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2a10: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2a20: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2a30: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2a40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2a50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
2a60: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
2a70: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
2a80: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
2a90: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
2aa0: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
2ab0: 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54  tFKey;..  if( pT
2ac0: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
2ad0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
2ae0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
2af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2b00: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
2b10: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
2b20: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
2b30: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
2b40: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
2b50: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2b60: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
2b70: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
2b80: 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62   || (pTable->iDb
2b90: 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  ==0 && pIndex->i
2ba0: 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71  Db==1) );.    sq
2bb0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2bc0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
2bd0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2be0: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
2bf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c00: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
2c10: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
2c20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
2c30: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
2c40: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
2c50: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
2c60: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
2c70: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
2c80: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
2c90: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
2ca0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
2cb0: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
2cc0: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62  ( pTable->iDb<db
2cd0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
2ce0: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
2cf0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
2d00: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
2d10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
2d30: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
2d40: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
2d50: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
2d60: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
2d70: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
2d80: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2d90: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
2da0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2db0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
2dc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2dd0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
2de0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
2df0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e00: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
2e10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2e30: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
2e40: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
2e60: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2e70: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ol);.  if( pTabl
2e80: 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20  e->zColAff ){.  
2e90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2ea0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
2eb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2ec0: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
2ed0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
2ee0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
2ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
2f00: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
2f10: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
2f20: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
2f30: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
2f40: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
2f50: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
2f60: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
2f70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2f80: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
2f90: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
2fa0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
2fb0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
2fc0: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
2fd0: 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20  *pF2;.  int i = 
2fe0: 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  p->iDb;.  assert
2ff0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
3000: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
3010: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
3020: 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].tblHash, p->zN
3030: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
3040: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
3050: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
3060: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
3070: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
3080: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
3090: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69  NextFrom){.    i
30a0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
30b0: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
30c0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
30d0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
30e0: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
30f0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3100: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
3110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
3120: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
3130: 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  [i].aFKey, pF1->
3140: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
3150: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c  NextTo);.    }el
3160: 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
3170: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
3180: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
3190: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
31a0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29  .      if( pF2 )
31b0: 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70  {.        pF2->p
31c0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
31d0: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  extTo;.      }. 
31e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
31f0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
3200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , p);.}../*.** C
3210: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d  onstruct the nam
3220: 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c  e of a user tabl
3230: 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
3240: 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53  a token..**.** S
3250: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3260: 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65   name is obtaine
3270: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3280: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a  loc() and must.*
3290: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
32a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
32b0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
32c0: 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f  ite3TableNameFro
32d0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
32e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
32f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
3300: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
3310: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74  ame->n);.  sqlit
3320: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3330: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
3350: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3360: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
3370: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
3380: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
3390: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
33a0: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
33b0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
33c0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
33d0: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
33e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
33f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3400: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
3410: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
3420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3430: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
3440: 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71  STER_ROOT);.  sq
3450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3460: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
3470: 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71  ns, 0, 5); /* sq
3480: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
3490: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a  5 columns */.}..
34a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
34b0: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
34c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
34d0: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
34e0: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
34f0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
3500: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
3510: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
3520: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
3530: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
3540: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
3550: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
3560: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
3570: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
3580: 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62  t..*/.int findDb
3590: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
35a0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
35b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
35c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
35d0: 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d  {.    if( pName-
35e0: 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61  >n==strlen(db->a
35f0: 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20  Db[i].zName) && 
3600: 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69  .        0==sqli
3610: 74 65 33 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e  te3StrNICmp(db->
3620: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  aDb[i].zName, pN
3630: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3640: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3650: 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n i;.    }.  }. 
3660: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69   return -1;.}..i
3670: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
3680: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
3690: 70 50 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e  pParse, .  Token
36a0: 20 2a 70 4e 61 6d 65 31 2c 20 0a 20 20 54 6f 6b   *pName1, .  Tok
36b0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 0a 20 20 54  en *pName2, .  T
36c0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a 29  oken **pUnqual.)
36d0: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  {.  int iDb;.  s
36e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
3700: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
3710: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
3720: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
3730: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
3740: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
3750: 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64    iDb = findDb(d
3760: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
3770: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
3780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3790: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
37a0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
37b0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
37c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
37d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
37e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
37f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3800: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
3810: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
3820: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
3830: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
3840: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
3850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
3860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
3870: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
3880: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
3890: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
38a0: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
38b0: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
38c0: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
38d0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
38e0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
38f0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
3900: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
3910: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
3920: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
3930: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
3940: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
3950: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
3960: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
3970: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
3980: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
3990: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
39a0: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
39b0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
39c0: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
39d0: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
39e0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
39f0: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
3a00: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
3a10: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
3a20: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
3a30: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
3a40: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
3a50: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
3a60: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
3a70: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
3a80: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
3a90: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
3aa0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
3ab0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
3ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3ad0: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
3ae0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
3af0: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
3b00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3b10: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
3b20: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
3b30: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
3b40: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
3b50: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
3b60: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
3b70: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
3b80: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
3b90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3ba0: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
3bb0: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
3bc0: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
3bd0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
3be0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
3bf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
3c00: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
3c10: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
3c20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3c30: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
3c40: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
3c50: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
3c60: 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e  e "CREATE" token
3c70: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
3c80: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
3c90: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
3ca0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
3cb0: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
3cc0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
3cd0: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
3ce0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
3cf0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
3d00: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
3d10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
3d20: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
3d30: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
3d40: 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w       /* True 
3d50: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
3d60: 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  W */.){.  Table 
3d70: 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78  *pTable;.  Index
3d80: 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a   *pIdx;.  char *
3d90: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20  zName;.  sqlite 
3da0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3db0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
3dc0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
3dd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
3de0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
3df0: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
3e00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
3e10: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
3e20: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3e30: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
3e40: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72   /* The table or
3e50: 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72   view name to cr
3e60: 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74  eate is passed t
3e70: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
3e80: 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70  ia tokens.  ** p
3e90: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
3ea0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
3eb0: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
3ec0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
3ed0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
3ee0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
3ef0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  .yyy (...);.  **
3f00: 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d   .  ** Then pNam
3f10: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
3f20: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
3f30: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
3f40: 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74  r hand if.  ** t
3f50: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
3f60: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
3f70: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a  fied, i.e.:.  **
3f80: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
3f90: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a  LE yyy(...);.  *
3fa0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  *.  ** Then pNam
3fb0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
3fc0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
3fd0: 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ""..  **.  ** T
3fe0: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65  he call below se
3ff0: 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69  ts the pName poi
4000: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
4010: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
4020: 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65  e1 or.  ** pName
4030: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4040: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4050: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76  able name. The v
4060: 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20  ariable iDb is. 
4070: 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69   ** set to the i
4080: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
4090: 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61  base that the ta
40a0: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74  ble or view is t
40b0: 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  o be.  ** create
40c0: 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  d in..  */.  iDb
40d0: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
40e0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
40f0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
4100: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
4110: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <0 ) return;.  i
4120: 66 28 20 69 73 54 65 6d 70 20 26 26 20 69 44 62  f( isTemp && iDb
4130: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
4140: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
4150: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
4160: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
4170: 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  fied */.    sqli
4180: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4190: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
41a0: 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  able name must b
41b0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b  e unqualified");
41c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
41d0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
41e0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d  .  }.  if( isTem
41f0: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
4200: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
4210: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
4220: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54 61  Name = sqlite3Ta
4230: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
4240: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
4250: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
4260: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
4270: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
4280: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
4290: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
42a0: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
42b0: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
42c0: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
42d0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
42e0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
42f0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
4300: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
4310: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
4320: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
4330: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
4340: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
4350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
4360: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
4370: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
4380: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
4390: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
43a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
43b0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
43c0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
43d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
43e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
43f0: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
4400: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
4410: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
4420: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
4430: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
4440: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
4450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4460: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
4470: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4490: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
44a0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
44b0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
44c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
44d0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
44e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
44f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
4500: 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20  * Before trying 
4510: 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70  to create a temp
4520: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b  orary table, mak
4530: 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65  e sure the Btree
4540: 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   for.  ** holdin
4550: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
4560: 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f  es is open..  */
4570: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26  .  if( isTemp &&
4580: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
4590: 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
45a0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
45b0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
45c0: 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
45d0: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
45e0: 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
45f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
4600: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
4610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4620: 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
4630: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
4640: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
4650: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
4660: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
4670: 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
4680: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4690: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
46a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
46b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
46c0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
46d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
46e0: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
46f0: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
4700: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
4710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4720: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4730: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4740: 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
4750: 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
4760: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
4770: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
4780: 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
4790: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
47a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
47b0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
47c0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
47d0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
47e0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
47f0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
4800: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
4810: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
4820: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
4830: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
4840: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   ** it does..  *
4850: 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  /.  pTable = sql
4860: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
4870: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
4880: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
4890: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
48a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
48b0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
48c0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
48d0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
48e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
48f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
4900: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
4910: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
4920: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
4930: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
4940: 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20    (pIdx->iDb==0 
4950: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
4960: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
4970: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4980: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
4990: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
49a0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
49b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
49c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
49d0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
49e0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
49f0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
4a00: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
4a10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
4a20: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
4a30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
4a40: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
4a50: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  me;.  pTable->nC
4a60: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
4a70: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
4a80: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
4a90: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
4aa0: 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ex = 0;.  pTable
4ab0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69  ->iDb = iDb;.  i
4ac0: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
4ad0: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65  able ) sqlite3De
4ae0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
4af0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4b00: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
4b10: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
4b20: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
4b30: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
4b40: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
4b50: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
4b60: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
4b70: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
4b80: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
4b90: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
4ba0: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
4bb0: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
4bc0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
4bd0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
4be0: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
4bf0: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
4c00: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
4c10: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
4c20: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
4c30: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
4c40: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
4c50: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
4c60: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
4c70: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
4c80: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
4c90: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
4ca0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
4cb0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
4cc0: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
4cd0: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
4ce0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
4cf0: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
4d00: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
4d10: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  se))!=0 ){.    s
4d20: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
4d30: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
4d40: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  , 0, iDb);.    i
4d50: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
4d60: 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d      /* Every tim
4d70: 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73  e a new table is
4d80: 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 6c   created the fil
4d90: 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 20 20 2a  e-format.      *
4da0: 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d  * and encoding m
4db0: 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73  eta-values are s
4dc0: 65 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  et in the databa
4dd0: 73 65 2c 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  se, in.      ** 
4de0: 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65  case this is the
4df0: 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65   first table cre
4e00: 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ated..      */. 
4e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
4e30: 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  ger, db->file_fo
4e40: 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rmat, 0);.      
4e50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e60: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
4e70: 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20  , iDb, 1);.     
4e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e90: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
4ea0: 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20   db->enc, 0);.  
4eb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ec0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4ed0: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20  okie, iDb, 4);. 
4ee0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4ef0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4f00: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  v, iDb);.    sql
4f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4f20: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
4f30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4f40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4f50: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
4f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f70: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
4f80: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4f90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4fa0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
4fb0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
4fc0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
4fd0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
4fe0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
4ff0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
5000: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
5010: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
5020: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
5030: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
5040: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
5050: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5060: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
5070: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
5080: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
5090: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
50a0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
50b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
50c0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
50d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
50e0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
50f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5100: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
5110: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
5120: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f  har *z = 0;.  Co
5130: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
5140: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
5150: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
5160: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
5170: 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70  SetNString(&z, p
5180: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
5190: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n, 0);.  if( z==
51a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
51b0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
51c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
51d0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
51e0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
51f0: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
5200: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
5210: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
5230: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
5240: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
5250: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5260: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
5270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5280: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
5290: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
52a0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
52b0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
52c0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
52d0: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
52e0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
52f0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
5300: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
5310: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
5320: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
5330: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
5340: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
5350: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
5360: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
5370: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
5380: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
5390: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
53a0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
53b0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
53c0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
53d0: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
53e0: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
53f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
5400: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
5410: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
5420: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
5430: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
5440: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
5450: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
5460: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70  _NONE;.  pCol->p
5470: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
5480: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5490: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
54a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
54b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
54c0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
54d0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
54e0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
54f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5500: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
5510: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
5520: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
5530: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
5540: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5550: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
5560: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5570: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5580: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
55a0: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
55b0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
55c0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
55d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
55e0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
55f0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5600: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5610: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5620: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
5630: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
5640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5660: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
5670: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
5680: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
5690: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
56a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
56b0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
56c0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
56d0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
56e0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
56f0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
5700: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
5710: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5720: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5730: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
5740: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
5750: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
5760: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
5770: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
5780: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
5790: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
57a0: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
57b0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
57c0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
57d0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
57e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
57f0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
5800: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
5810: 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a  *pFirst, Token *
5820: 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20  pLast){.  Table 
5830: 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  *p;.  int i, j;.
5840: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
5850: 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75  *z, **pz;.  Colu
5860: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
5870: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5880: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5890: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
58a0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
58b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
58c0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
58d0: 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54    pz = &pCol->zT
58e0: 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74  ype;.  n = pLast
58f0: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74  ->n + Addr(pLast
5900: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72  ->z) - Addr(pFir
5910: 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  st->z);.  sqlite
5920: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
5930: 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29  pFirst->z, n, 0)
5940: 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69  ;.  z = *pz;.  i
5950: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
5960: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
5970: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
5980: 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  nt c = z[i];.   
5990: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
59a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
59b0: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
59c0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43    z[j] = 0;.  pC
59d0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
59e0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
59f0: 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  pe(z, n);.}../*.
5a00: 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b  ** The given tok
5a10: 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  en is the defaul
5a20: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
5a30: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
5a40: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
5a50: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
5a60: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
5a70: 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20   If "minusFlag" 
5a80: 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d  is true, it.** m
5a90: 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  eans the value t
5aa0: 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65  oken was precede
5ab0: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
5ac0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
5ad0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5ae0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
5af0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
5b00: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
5b10: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
5b20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
5b30: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
5b40: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
5b50: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
5b60: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
5b70: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
5b80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
5b90: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
5ba0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5bb0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
5bc0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
5bd0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
5be0: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
5bf0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
5c00: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
5c10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
5c20: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d  etNString(pz, "-
5c30: 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  ", 1, pVal->z, p
5c40: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65  Val->n, 0);.  }e
5c50: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5c60: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
5c70: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
5c80: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
5c90: 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  e3Dequote(*pz);.
5ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
5cb0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
5cc0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
5cd0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
5ce0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
5cf0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
5d00: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
5d10: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
5d20: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
5d30: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
5d40: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
5d50: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
5d60: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
5d70: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
5d80: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
5d90: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
5da0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
5db0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
5dc0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
5dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
5de0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
5df0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
5e00: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
5e10: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
5e20: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
5e30: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
5e40: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
5e50: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
5e60: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
5e70: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
5e80: 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65  e row id.  (Exce
5e90: 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61  ption:.** For ba
5ea0: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
5eb0: 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
5ec0: 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e   databases, do n
5ed0: 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66  ot do this.** if
5ee0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
5ef0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
5f00: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29  is less than 1.)
5f10: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
5f20: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
5f30: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
5f40: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
5f50: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
5f60: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
5f70: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
5f80: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
5f90: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
5fa0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
5fb0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5fc0: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
5fd0: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
5fe0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5ff0: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
6000: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
6010: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
6020: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
6030: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
6040: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
6050: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6060: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72  ddPrimaryKey(Par
6070: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6080: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
6090: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
60a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
60b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
60c0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
60d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
60e0: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
60f0: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
6100: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
6110: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
6120: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
6130: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6140: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
6150: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
6160: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
6170: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
6180: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
6190: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
61a0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
61b0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
61c0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
61d0: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
61e0: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
61f0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
6200: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
6210: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
6220: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
6230: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
6240: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
6250: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
6260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6270: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6280: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
6290: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
62a0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
62b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
62c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
62d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
62e0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20  ol<pTab->nCol ) 
62f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
6300: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
6310: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6320: 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69  ist->nExpr>1 ) i
6330: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  Col = -1;.  }.  
6340: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
6350: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
6360: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
6370: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
6380: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
6390: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
63a0: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
63b0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
63c0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
63d0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
63e0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
63f0: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
6400: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
6410: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
6420: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
6430: 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rror, 0, 0);.   
6440: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
6450: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
6460: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
6470: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
6480: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
6490: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
64a0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
64b0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
64c0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
64d0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
64e0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
64f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6500: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
6510: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
6530: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
6540: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64   Table *p;.  Ind
6550: 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c  ex *pIdx;.  Coll
6560: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
6570: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
6580: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6590: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
65a0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
65b0: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
65c0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
65d0: 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  q(pParse, zType,
65e0: 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43   nType);.  p->aC
65f0: 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43  ol[i].pColl = pC
6600: 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  oll;..  /* If th
6610: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
6620: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
6630: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
6640: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a  ATE <type>",.  *
6650: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
6660: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
6670: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
6680: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
6690: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
66a0: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
66b0: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
66c0: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
66d0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d   */.  for(pIdx =
66e0: 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78   p->pIndex; pIdx
66f0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
6700: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
6710: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
6720: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  1 );.    if( pId
6730: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
6740: 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  i ) pIdx->keyInf
6750: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f  o.aColl[0] = pCo
6760: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
6770: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
6780: 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  rn an entry from
6790: 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71   the db.aCollSeq
67a0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
67b0: 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65  the entry.** spe
67c0: 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20  cified by zName 
67d0: 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74  and nName is not
67e0: 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d   found and param
67f0: 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73  eter 'create' is
6800: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63  .** true, then c
6810: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  reate a new entr
6820: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  y. Otherwise ret
6830: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
6840: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f  Each pointer sto
6850: 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
6860: 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  e3.aCollSeq hash
6870: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
6880: 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74  an.** array of t
6890: 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72  hree CollSeq str
68a0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72  uctures. The fir
68b0: 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74  st is the collat
68c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
68d0: 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55  prefferred for U
68e0: 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64  TF-8, the second
68f0: 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74   UTF-16le, and t
6900: 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62  he third UTF-16b
6910: 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20  e..**.** Stored 
6920: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
6930: 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c  r the three coll
6940: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
6950: 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  is a copy of.** 
6960: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
6970: 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70  quence name. A p
6980: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
6990: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
69a0: 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61  in.** each colla
69b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74  tion sequence st
69c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
69d0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e  ic CollSeq * fin
69e0: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20  dCollSeqEntry(. 
69f0: 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 63   sqlite *db,.  c
6a00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6a10: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
6a20: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
6a30: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6a40: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
6a50: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
6a60: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
6a70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
6a80: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
6a90: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
6aa0: 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20  .  if( 0==pColl 
6ab0: 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20  && create ){.   
6ac0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d   pColl = sqliteM
6ad0: 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28  alloc( 3*sizeof(
6ae0: 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20  *pColl) + nName 
6af0: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
6b00: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
6b10: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[0].zName = (
6b20: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
6b30: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e  .      pColl[0].
6b40: 65 6e 63 20 3d 20 54 45 58 54 5f 55 74 66 38 3b  enc = TEXT_Utf8;
6b50: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
6b60: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
6b70: 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20  pColl[3];.      
6b80: 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 54  pColl[1].enc = T
6b90: 45 58 54 5f 55 74 66 31 36 6c 65 3b 0a 20 20 20  EXT_Utf16le;.   
6ba0: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d     pColl[2].zNam
6bb0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
6bc0: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
6bd0: 6c 5b 32 5d 2e 65 6e 63 20 3d 20 54 45 58 54 5f  l[2].enc = TEXT_
6be0: 55 74 66 31 36 62 65 3b 0a 20 20 20 20 20 20 6d  Utf16be;.      m
6bf0: 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a  emcpy(pColl[0].z
6c00: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
6c10: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
6c20: 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d  [0].zName[nName]
6c30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
6c40: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
6c50: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f  b->aCollSeq, pCo
6c60: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61  ll[0].zName, nNa
6c70: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  me, pColl);.    
6c80: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
6c90: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  Coll;.}../*.** P
6ca0: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
6cb0: 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d 38  oints to a UTF-8
6cc0: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20   encoded string 
6cd0: 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67  nName bytes long
6ce0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
6cf0: 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72  CollSeq* pointer
6d00: 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 69   for the collati
6d10: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
6d20: 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74  d zName.** for t
6d30: 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63  he encoding 'enc
6d40: 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ' from the datab
6d50: 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20  ase 'db'..**.** 
6d60: 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70 65  If the entry spe
6d70: 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66 6f  cified is not fo
6d80: 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65 27  und and 'create'
6d90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 63   is true, then c
6da0: 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65  reate a.** new e
6db0: 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65  ntry.  Otherwise
6dc0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
6dd0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
6de0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20  3FindCollSeq(.  
6df0: 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 75 38  sqlite *db,.  u8
6e00: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
6e10: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
6e20: 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72   nName,.  int cr
6e30: 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  eate.){.  CollSe
6e40: 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43  q *pColl = findC
6e50: 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20  ollSeqEntry(db, 
6e60: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72  zName, nName, cr
6e70: 65 61 74 65 29 3b 0a 20 20 69 66 28 20 70 43 6f  eate);.  if( pCo
6e80: 6c 6c 20 29 20 73 77 69 74 63 68 28 20 65 6e 63  ll ) switch( enc
6e90: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 45 58   ){.    case TEX
6ea0: 54 5f 55 74 66 38 3a 0a 20 20 20 20 20 20 62 72  T_Utf8:.      br
6eb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 45  eak;.    case TE
6ec0: 58 54 5f 55 74 66 31 36 6c 65 3a 0a 20 20 20 20  XT_Utf16le:.    
6ed0: 20 20 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c    pColl = &pColl
6ee0: 5b 31 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  [1];.      break
6ef0: 3b 0a 20 20 20 20 63 61 73 65 20 54 45 58 54 5f  ;.    case TEXT_
6f00: 55 74 66 31 36 62 65 3a 0a 20 20 20 20 20 20 70  Utf16be:.      p
6f10: 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 32 5d  Coll = &pColl[2]
6f20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6f30: 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20     default: .   
6f40: 20 20 20 61 73 73 65 72 74 28 21 22 43 61 6e 6e     assert(!"Cann
6f50: 6f 74 20 68 61 70 70 65 6e 22 29 3b 0a 20 20 7d  ot happen");.  }
6f60: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
6f70: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
6f80: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73  callCollNeeded(s
6f90: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
6fa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
6fb0: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 4e  t nName){.  /* N
6fc0: 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  o collation sequ
6fd0: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70  ence of this typ
6fe0: 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64  e for this encod
6ff0: 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65  ing is registere
7000: 64 2e 0a 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65  d..  ** Call the
7010: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
7020: 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ry to see if it 
7030: 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69  can supply us wi
7040: 74 68 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 63  th one..  */.  c
7050: 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d  har *zExternal =
7060: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64   0;.  assert( !d
7070: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c  b->xCollNeeded |
7080: 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  | !db->xCollNeed
7090: 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e  ed16 );.  if( nN
70a0: 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20  ame<0 ) nName = 
70b0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
70c0: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
70d0: 65 64 65 64 20 29 7b 0a 20 20 20 20 7a 45 78 74  eded ){.    zExt
70e0: 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53 74  ernal = sqliteSt
70f0: 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61  rNDup(zName, nNa
7100: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45  me);.    if( !zE
7110: 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  xternal ) return
7120: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78 43 6f 6c  ;.      db->xCol
7130: 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c  lNeeded(db->pCol
7140: 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20  lNeededArg, db, 
7150: 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45  (int)db->enc, zE
7160: 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20  xternal);.  }.  
7170: 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  if( db->xCollNee
7180: 64 65 64 31 36 20 29 7b 0a 20 20 20 20 69 66 28  ded16 ){.    if(
7190: 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41   SQLITE_BIGENDIA
71a0: 4e 20 29 7b 0a 20 20 20 20 20 20 7a 45 78 74 65  N ){.      zExte
71b0: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 75 74  rnal = sqlite3ut
71c0: 66 38 74 6f 31 36 62 65 28 7a 4e 61 6d 65 2c 20  f8to16be(zName, 
71d0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nName);.    }els
71e0: 65 7b 0a 20 20 20 20 20 20 7a 45 78 74 65 72 6e  e{.      zExtern
71f0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 75 74 66 38  al = sqlite3utf8
7200: 74 6f 31 36 6c 65 28 7a 4e 61 6d 65 2c 20 6e 4e  to16le(zName, nN
7210: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
7220: 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29  if( !zExternal )
7230: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d   return;.    db-
7240: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64  >xCollNeeded16(d
7250: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
7260: 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e  g, db, (int)db->
7270: 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b  enc, zExternal);
7280: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 45 78 74 65  .  }.  if( zExte
7290: 72 6e 61 6c 20 29 20 73 71 6c 69 74 65 46 72 65  rnal ) sqliteFre
72a0: 65 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 7d 0a  e(zExternal);.}.
72b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 74  .static int synt
72c0: 68 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  hCollSeq(Parse *
72d0: 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20  pParse, CollSeq 
72e0: 2a 70 43 6f 6c 6c 29 7b 0a 20 20 2f 2a 20 54 68  *pColl){.  /* Th
72f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
7300: 6f 72 79 20 66 61 69 6c 65 64 20 74 6f 20 64 65  ory failed to de
7310: 6c 69 76 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  liver a function
7320: 20 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62   but there may b
7330: 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 65 72  e.  ** other ver
7340: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 63 6f  sions of this co
7350: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
7360: 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78 74   (for other text
7370: 20 65 6e 63 6f 64 69 6e 67 73 29 0a 20 20 2a 2a   encodings).  **
7380: 20 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65 20   available. Use 
7390: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 69 6e 73  one of these ins
73a0: 74 65 61 64 2e 20 41 76 6f 69 64 20 61 20 55 54  tead. Avoid a UT
73b0: 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36 0a 20  F-8 <-> UTF-16. 
73c0: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69   ** conversion i
73d0: 66 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  f possible..  */
73e0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
73f0: 6c 32 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  l2 = 0;.  char *
7400: 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  z = pColl->zName
7410: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  ;.  int n = strl
7420: 65 6e 28 7a 29 3b 0a 20 20 73 77 69 74 63 68 28  en(z);.  switch(
7430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
7440: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 45 58   ){.    case TEX
7450: 54 5f 55 74 66 31 36 6c 65 3a 0a 20 20 20 20 20  T_Utf16le:.     
7460: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
7470: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
7480: 72 73 65 2d 3e 64 62 2c 20 54 45 58 54 5f 55 74  rse->db, TEXT_Ut
7490: 66 31 36 62 65 2c 20 7a 2c 20 6e 2c 20 30 29 3b  f16be, z, n, 0);
74a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
74b0: 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 69  Coll2 );.      i
74c0: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20  f( pColl2->xCmp 
74d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
74e0: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
74f0: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
7500: 65 2d 3e 64 62 2c 20 54 45 58 54 5f 55 74 66 38  e->db, TEXT_Utf8
7510: 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20  , z, n, 0);.    
7520: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 32    assert( pColl2
7530: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
7540: 0a 0a 20 20 20 20 63 61 73 65 20 54 45 58 54 5f  ..    case TEXT_
7550: 55 74 66 31 36 62 65 3a 0a 20 20 20 20 20 20 70  Utf16be:.      p
7560: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
7570: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
7580: 65 2d 3e 64 62 2c 54 45 58 54 5f 55 74 66 31 36  e->db,TEXT_Utf16
7590: 6c 65 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  le, z, n, 0);.  
75a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
75b0: 6c 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l2 );.      if( 
75c0: 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 20 62  pColl2->xCmp ) b
75d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 6f 6c  reak;.      pCol
75e0: 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  l2 = sqlite3Find
75f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e  CollSeq(pParse->
7600: 64 62 2c 54 45 58 54 5f 55 74 66 38 2c 20 7a 2c  db,TEXT_Utf8, z,
7610: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   n, 0);.      as
7620: 73 65 72 74 28 20 70 43 6f 6c 6c 32 20 29 3b 0a  sert( pColl2 );.
7630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
7640: 20 20 63 61 73 65 20 54 45 58 54 5f 55 74 66 38    case TEXT_Utf8
7650: 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c 32 20 3d  :.      pColl2 =
7660: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
7670: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  Seq(pParse->db,T
7680: 45 58 54 5f 55 74 66 31 36 62 65 2c 20 7a 2c 20  EXT_Utf16be, z, 
7690: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  n, 0);.      ass
76a0: 65 72 74 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20  ert( pColl2 );. 
76b0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d       if( pColl2-
76c0: 3e 78 43 6d 70 20 29 20 62 72 65 61 6b 3b 0a 20  >xCmp ) break;. 
76d0: 20 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71       pColl2 = sq
76e0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
76f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 45 58 54  (pParse->db,TEXT
7700: 5f 55 74 66 31 36 6c 65 2c 20 7a 2c 20 6e 2c 20  _Utf16le, z, n, 
7710: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
7720: 28 20 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20  ( pColl2 );.    
7730: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69    break;.  }.  i
7740: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20  f( pColl2->xCmp 
7750: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43  ){.    memcpy(pC
7760: 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a  oll, pColl2, siz
7770: 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20  eof(CollSeq));. 
7780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
7790: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
77a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
77b0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
77c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
77d0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
77e0: 73 65 71 75 65 6e 63 65 3a 20 22 2c 20 0a 20 20  sequence: ", .  
77f0: 20 20 20 20 20 20 20 20 2d 31 2c 20 7a 2c 20 6e          -1, z, n
7800: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7810: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7820: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7830: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
7840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7860: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7870: 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   on a collation 
7880: 73 65 71 75 65 6e 63 65 20 62 65 66 6f 72 65 20  sequence before 
7890: 69 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  it is used to.**
78a0: 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
78b0: 73 20 64 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e  s defined. An un
78c0: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
78d0: 6e 20 73 65 71 75 65 6e 63 65 20 65 78 69 73 74  n sequence exist
78e0: 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61  s when.** a data
78f0: 62 61 73 65 20 69 73 20 6c 6f 61 64 65 64 20 74  base is loaded t
7900: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 72 65 66  hat contains ref
7910: 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61  erences to colla
7920: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a  tion sequences.*
7930: 2a 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20  * that have not 
7940: 62 65 65 6e 20 64 65 66 69 6e 65 64 20 62 79 20  been defined by 
7950: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
7960: 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a  ollation() etc..
7970: 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75 69 72 65  **.** If require
7980: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
7990: 63 61 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61  calls the 'colla
79a0: 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c  tion needed' cal
79b0: 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75  lback to.** requ
79c0: 65 73 74 20 61 20 64 65 66 69 6e 69 74 69 6f 6e  est a definition
79d0: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   of the collatin
79e0: 67 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 74  g sequence. If t
79f0: 68 69 73 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b  his doesn't work
7a00: 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c  , .** an equival
7a10: 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
7a20: 71 75 65 6e 63 65 20 74 68 61 74 20 75 73 65 73  quence that uses
7a30: 20 61 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67   a text encoding
7a40: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
7a50: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  om the main data
7a60: 62 61 73 65 20 69 73 20 73 75 62 73 74 69 74 75  base is substitu
7a70: 74 65 64 2c 20 69 66 20 6f 6e 65 20 69 73 20 61  ted, if one is a
7a80: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  vailable..*/.int
7a90: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
7aa0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
7ab0: 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
7ac0: 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  ll){.  if( pColl
7ad0: 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   && !pColl->xCmp
7ae0: 20 29 7b 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c   ){.    callColl
7af0: 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64  Needed(pParse->d
7b00: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  b, pColl->zName,
7b10: 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a   strlen(pColl->z
7b20: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20  Name));.    if( 
7b30: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20  !pColl->xCmp && 
7b40: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61  synthCollSeq(pPa
7b50: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20  rse, pColl) ){. 
7b60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7b70: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
7b80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7b90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
7ba0: 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78  qlite3CheckIndex
7bb0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
7bc0: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
7bd0: 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20  dx){.  if( pIdx 
7be0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
7c00: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
7c10: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7c20: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
7c30: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65  pParse, pIdx->ke
7c40: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20  yInfo.aColl[i]) 
7c50: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7c60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
7c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7c80: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7c90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
7ca0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
7cb0: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
7cc0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
7cd0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
7ce0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
7cf0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
7d00: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
7d10: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
7d20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
7d30: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
7d40: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
7d50: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
7d60: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
7d70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
7d80: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
7d90: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
7da0: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
7db0: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
7dc0: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
7dd0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
7de0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
7df0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
7e00: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
7e10: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
7e20: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
7e30: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
7e40: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
7e50: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
7e60: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
7e70: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
7e80: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
7e90: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
7ea0: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
7eb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
7ec0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
7ed0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
7ee0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
7ef0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  o.** pParse..*/.
7f00: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
7f10: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
7f20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
7f30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
7f40: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38  int nName){.  u8
7f50: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
7f60: 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69  b->enc;.  u8 ini
7f70: 74 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e  tbusy = pParse->
7f80: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
7f90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
7fa0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
7fb0: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
7fc0: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61   enc, zName, nNa
7fd0: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
7fe0: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
7ff0: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
8000: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
8010: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
8020: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
8030: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
8040: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
8050: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
8060: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
8070: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
8080: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
8090: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
80a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
80b0: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
80c0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  ->db, zName, nNa
80d0: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  me);.    pColl =
80e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
80f0: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
8100: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
8110: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
8120: 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e  Coll && !pColl->
8130: 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  xCmp ){.      /*
8140: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   There may be a 
8150: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  version of the c
8160: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8170: 65 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  e that requires.
8180: 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61        ** transla
8190: 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63  tion between enc
81a0: 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66  odings. Search f
81b0: 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e 74 68  or it with synth
81c0: 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20  CollSeq()..     
81d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79   */.      if( sy
81e0: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
81f0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
8200: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8220: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e  ..  /* If nothin
8230: 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64  g has been found
8240: 2c 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f  , write the erro
8250: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70  r message into p
8260: 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21  Parse */.  if( !
8270: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
8280: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
8290: 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Cmp) ){.    if( 
82a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
82b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
82c0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
82d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
82e0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
82f0: 73 65 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c  sequence: ", -1,
8300: 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  .          zName
8310: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , nName, 0);.   
8320: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
8330: 45 72 72 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c  Err++;.    pColl
8340: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8350: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f  rn pColl;.}..../
8360: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8370: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8380: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8390: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
83a0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
83b0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
83c0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
83d0: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
83e0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
83f0: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74  nt nType){.  int
8400: 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20   n, i;.  struct 
8410: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
8420: 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77   *zSub;  /* Keyw
8430: 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67 20 74  ords substring t
8440: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
8450: 20 20 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20      int nSub;   
8460: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
8470: 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20   of zSub */.    
8480: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
8490: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
84a0: 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d  o return if it m
84b0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75  atches */.  } su
84c0: 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20  bstrings[] = {. 
84d0: 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53     {"INT",  3, S
84e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
84f0: 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c  R},.    {"CHAR",
8500: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
8510: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42  EXT},.    {"CLOB
8520: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
8530: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45  _TEXT},.    {"TE
8540: 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  XT", 4, SQLITE_A
8550: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
8560: 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45  BLOB", 4, SQLITE
8570: 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b  _AFF_NONE},.  };
8580: 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30  ..  if( nType==0
8590: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
85a0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
85b0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
85c0: 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  <sizeof(substrin
85d0: 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74  gs)/sizeof(subst
85e0: 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  rings[0]); i++){
85f0: 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75  .    int c1 = su
8600: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62  bstrings[i].zSub
8610: 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  [0];.    int c2 
8620: 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20  = tolower(c1);. 
8630: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e     int limit = n
8640: 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67  Type - substring
8650: 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63  s[i].nSub;.    c
8660: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
8670: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
8680: 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  b;.    for(n=0; 
8690: 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a  n<=limit; n++){.
86a0: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54        int c = zT
86b0: 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  ype[n];.      if
86c0: 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63  ( (c==c1 || c==c
86d0: 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2).             
86e0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
86f0: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c  NICmp(&zType[n],
8700: 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69   z, substrings[i
8710: 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20  ].nSub) ){.     
8720: 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74 72     return substr
8730: 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79  ings[i].affinity
8740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8760: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
8770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75  .}../*.** Come u
8780: 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e  p with a new ran
8790: 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  dom value for th
87a0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
87b0: 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74    Make sure.** t
87c0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
87d0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
87e0: 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  he old..**.** Th
87f0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
8800: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8810: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
8820: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
8830: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
8840: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
8850: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
8860: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
8870: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
8880: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
8890: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
88a0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
88b0: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
88c0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
88d0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
88e0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
88f0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
8900: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
8910: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
8920: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
8930: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
8940: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
8950: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
8960: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
8970: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
8980: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
8990: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
89a0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
89b0: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
89c0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
89d0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
89e0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
89f0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
8a00: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
8a10: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
8a20: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
8a30: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
8a40: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
8a50: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
8a60: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
8a70: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
8a80: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
8a90: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64  Cookie(sqlite *d
8aa0: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
8ab0: 69 44 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  iDb){.  unsigned
8ac0: 20 63 68 61 72 20 72 3b 0a 20 20 69 6e 74 20 2a   char r;.  int *
8ad0: 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20  pSchemaCookie = 
8ae0: 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  &(db->aDb[iDb].s
8af0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a  chema_cookie);..
8b00: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
8b10: 65 73 73 28 31 2c 20 26 72 29 3b 0a 20 20 2a 70  ess(1, &r);.  *p
8b20: 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a  SchemaCookie = *
8b30: 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 2b 20  pSchemaCookie + 
8b40: 72 20 2b 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61  r + 1;.  db->fla
8b50: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
8b60: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
8b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8b80: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2a 70  , OP_Integer, *p
8b90: 53 63 68 65 6d 61 43 6f 6f 6b 69 65 2c 20 30 29  SchemaCookie, 0)
8ba0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
8bb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
8bc0: 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d  okie, iDb, 0);.}
8bd0: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
8be0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
8bf0: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
8c00: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
8c10: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
8c20: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
8c30: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
8c40: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
8c50: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
8c60: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
8c70: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  l terminator..*/
8c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
8c90: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
8ca0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
8cb0: 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65  .  int needQuote
8cc0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b   = 0;.  for(n=0;
8cd0: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
8ce0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27      if( *z=='\''
8cf0: 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f   ){ n++; needQuo
8d00: 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  te=1; }.  }.  re
8d10: 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f  turn n + needQuo
8d20: 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  te*2;.}../*.** W
8d30: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
8d40: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
8d50: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
8d60: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
8d70: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
8d80: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
8d90: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
8da0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
8db0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e  Idx, char *zIden
8dc0: 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  t){.  int i, j, 
8dd0: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
8de0: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
8df0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
8e00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
8e10: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
8e20: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
8e30: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
8e40: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
8e50: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
8e60: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
8e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e80: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
8e90: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
8ea0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
8eb0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
8ec0: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66  i++] = '\'';.  f
8ed0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
8ee0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
8ef0: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
8f00: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
8f10: 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b  j]=='\'' ) z[i++
8f20: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
8f30: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
8f40: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
8f50: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
8f60: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
8f70: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
8f80: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8f90: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
8fa0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
8fb0: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
8fc0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
8fd0: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
8fe0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
8ff0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
9000: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
9010: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9020: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9030: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
9040: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
9050: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
9060: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
9070: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
9080: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
9090: 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  End;.  n = 0;.  
90a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
90b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ol; i++){.    n 
90c0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
90d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
90e0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f  ;.    if( p->aCo
90f0: 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a 20 20  l[i].zType ){.  
9100: 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e      n += (strlen
9110: 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  (p->aCol[i].zTyp
9120: 65 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  e) + 1);.    }. 
9130: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
9140: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
9150: 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20  .  if( n<40 ){. 
9160: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
9170: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
9180: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
9190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
91a0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
91b0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
91c0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
91d0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
91e0: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
91f0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
9200: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
9210: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
9220: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
9230: 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d  (zStmt, p->iDb==
9240: 31 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50  1 ? "CREATE TEMP
9250: 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41   TABLE " : "CREA
9260: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
9270: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
9280: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
9290: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
92a0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
92b0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30  = '(';.  for(i=0
92c0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
92d0: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
92e0: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
92f0: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
9300: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
9310: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
9320: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
9330: 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  , &k, p->aCol[i]
9340: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
9350: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70   p->aCol[i].zTyp
9360: 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  e ){.      zStmt
9370: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
9380: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9390: 5b 6b 5d 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  [k], p->aCol[i].
93a0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6b 20  zType);.      k 
93b0: 2b 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 61 43 6f  += strlen(p->aCo
93c0: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20  l[i].zType);.   
93d0: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28   }.  }.  strcpy(
93e0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
93f0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
9400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9410: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9420: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
9430: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
9440: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
9450: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9460: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
9470: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
9480: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
9490: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
94a0: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
94b0: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
94c0: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
94d0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
94e0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
94f0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
9500: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
9510: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
9520: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
9530: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
9540: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
9550: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
9560: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
9570: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
9580: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
9590: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
95a0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
95b0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
95c0: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
95d0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
95e0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
95f0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
9600: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9610: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
9620: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
9630: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
9640: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
9650: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
9660: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9670: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
9680: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
9690: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
96a0: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
96b0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
96c0: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
96d0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
96e0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
96f0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
9700: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
9710: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
9720: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
9730: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
9740: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
9750: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
9760: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
9770: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9780: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
9790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
97a0: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
97b0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  arse, Token *pEn
97c0: 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  d, Select *pSele
97d0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ct){.  Table *p;
97e0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
97f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
9800: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
9810: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
9820: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
9830: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
9840: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
9850: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9860: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
9870: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
9880: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
9890: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
98a0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
98b0: 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72  e table is gener
98c0: 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45  ated from a SELE
98d0: 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75  CT, then constru
98e0: 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ct the.  ** list
98f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20   of columns and 
9900: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
9910: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
9920: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 7d  ( pSelect ){.  }
9930: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
9940: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
9950: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
9960: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
9970: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
9980: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
9990: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
99a0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
99b0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
99c0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
99d0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
99e0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
99f0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
9a00: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
9a10: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
9a20: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
9a30: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
9a40: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
9a50: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
9a60: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
9a70: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
9a80: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
9a90: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
9aa0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
9ab0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
9ac0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
9ad0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
9ae0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
9af0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
9b00: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
9b10: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
9b20: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
9b30: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
9b40: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
9b50: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
9b60: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
9b70: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
9b80: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
9b90: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
9ba0: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
9bb0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
9bc0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
9bd0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
9be0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
9bf0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
9c00: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
9c10: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
9c20: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
9c30: 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d  dbe *v;..    v =
9c40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
9c50: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
9c60: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
9c70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
9c80: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
9c90: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
9ca0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
9cb0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
9cc0: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c  _CreateTable, 0,
9cd0: 20 70 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29   p->iDb, (char*)
9ce0: 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  &p->tnum, P3_POI
9cf0: 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NTER);.    }else
9d00: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
9d10: 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
9d20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9d30: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
9d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
9d50: 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 73 71  num = 0;..    sq
9d60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9d70: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
9d80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
9d90: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
9da0: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
9db0: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
9dc0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
9dd0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
9de0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
9df0: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
9e00: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
9e10: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
9e20: 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f  ble is on the to
9e30: 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74  p of the vdbe st
9e40: 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack..    **.    
9e50: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
9e60: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
9e70: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
9e80: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
9e90: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
9ea0: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
9eb0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
9ec0: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
9ed0: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
9ee0: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
9ef0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
9f00: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
9f10: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
9f20: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
9f30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9f40: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
9f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f60: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9f70: 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  , p->iDb, 0);.  
9f80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
9fa0: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
9fb0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
9fc0: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
9fd0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
9fe0: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
9ff0: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  ble, 1, 0, 0, 0,
a000: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a010: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a020: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
a030: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
a040: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
a050: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
a060: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
a070: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
a080: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
a090: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
a0a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0c0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
a0d0: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
a0e0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
a0f0: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
a100: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
a110: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
a120: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
a130: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
a140: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
a150: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
a160: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
a170: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
a180: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
a190: 65 72 54 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44  erTable(v, p->iD
a1a0: 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  b);..    sqlite3
a1b0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
a1c0: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e  ring8, 0, 0, p->
a1d0: 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c  pSelect==0?"tabl
a1e0: 65 22 3a 22 76 69 65 77 22 2c 50 33 5f 53 54 41  e":"view",P3_STA
a1f0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
a200: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
a210: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d  tring8, 0, 0, p-
a220: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
a230: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a240: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
a250: 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29   0, p->zName, 0)
a260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a270: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
a280: 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69  l, 3, 0);..    i
a290: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
a2a0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72      char *z = cr
a2b0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29  eateTableStmt(p)
a2c0: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20  ;.      n = z ? 
a2d0: 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20  strlen(z) : 0;. 
a2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
a300: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
a310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a320: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20  ngeP3(v, -1, z, 
a330: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
a340: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c  Free(z);.    }el
a350: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  se{.      if( p-
a360: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
a380: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
a390: 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20  , 0, 0, "CREATE 
a3a0: 56 49 45 57 20 22 2c 20 50 33 5f 53 54 41 54 49  VIEW ", P3_STATI
a3b0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
a3c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a3d0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
a3e0: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52  ring8, 0, 0, "CR
a3f0: 45 41 54 45 20 54 41 42 4c 45 20 22 2c 20 50 33  EATE TABLE ", P3
a400: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a410: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a420: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
a430: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
a440: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
a450: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20  ->sNameToken.z) 
a460: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
a470: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a480: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
a490: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a4a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
a4b0: 31 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  1, pParse->sName
a4c0: 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20  Token.z, n);.   
a4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a4e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  dOp(v, OP_Concat
a4f0: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 2, 0);.    }. 
a500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a510: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
a520: 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74  rd, 5, 0, "tttit
a530: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
a540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a550: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
a560: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
a570: 69 66 28 20 70 2d 3e 69 44 62 21 3d 31 20 29 7b  if( p->iDb!=1 ){
a580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
a590: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
a5a0: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d  , p->iDb);.    }
a5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a5c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
a5d0: 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 73  e, 0, 0);..    s
a5e0: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
a5f0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
a600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
a610: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
a620: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
a630: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
a640: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
a650: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a660: 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73  lain==0 && pPars
a670: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
a680: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
a690: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a     FKey *pFKey;.
a6a0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
a6b0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
a6c0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62  ->aDb[p->iDb].tb
a6d0: 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  lHash, .        
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74      p->zName, st
a700: 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31  rlen(p->zName)+1
a710: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
a720: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
a730: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
a740: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
a750: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
a760: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
a770: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
a780: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46      }.    for(pF
a790: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
a7a0: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
a7b0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
a7c0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
a7d0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
a7e0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
a7f0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
a800: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
a810: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
a820: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
a830: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
a840: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
a850: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
a860: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
a870: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
a880: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
a890: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
a8a0: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
a8b0: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
a8c0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
a8d0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
a8e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
a8f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
a900: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
a910: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
a920: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
a930: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
a940: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a950: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
a960: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
a970: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
a980: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
a990: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
a9a0: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
a9b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
a9c0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
a9d0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
a9e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
a9f0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
aa00: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
aa10: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
aa20: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
aa30: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
aa40: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
aa50: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
aa60: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
aa70: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
aa80: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
aa90: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
aaa0: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
aab0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
aac0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
aad0: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
aae0: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
aaf0: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
ab00: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
ab10: 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53  ame;..  sqlite3S
ab20: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
ab30: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31  , pBegin, pName1
ab40: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
ab50: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
ab60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ab70: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
ab80: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
ab90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
aba0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
abb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
abc0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
abd0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
abe0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
abf0: 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
ac00: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
ac10: 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c   pParse, p->iDb,
ac20: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
ac30: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
ac40: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
ac50: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
ac60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ac70: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
ac80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ac90: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
aca0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
acb0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
acc0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
acd0: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
ace0: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
acf0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
ad00: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
ad10: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
ad20: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
ad30: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
ad40: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
ad50: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
ad60: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
ad70: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
ad80: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
ad90: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
ada0: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
adb0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
adc0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
add0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
ade0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
adf0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
ae00: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
ae10: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
ae20: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
ae30: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
ae40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
ae50: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
ae60: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
ae70: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
ae80: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
ae90: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
aea0: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
aeb0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
aec0: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
aed0: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
aee0: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
aef0: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
af00: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
af10: 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20  = ((int)sEnd.z) 
af20: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
af30: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
af40: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
af50: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
af60: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
af70: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
af80: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
af90: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
afa0: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
afb0: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
afc0: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
afd0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
afe0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
aff0: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
b000: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
b010: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
b020: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
b030: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
b040: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
b050: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
b060: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
b070: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
b080: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
b090: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
b0a0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
b0b0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
b0c0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
b0d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
b0e0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
b0f0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
b100: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
b110: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
b120: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
b130: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72  *pTable){.  Expr
b140: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
b150: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
b160: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
b170: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
b180: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
b190: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
b1a0: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
b1b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
b1c0: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
b1d0: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
b1e0: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
b1f0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
b200: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
b210: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
b220: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
b230: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
b240: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
b250: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
b260: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
b270: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
b280: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
b290: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
b2a0: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
b2b0: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
b2c0: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
b2d0: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
b2e0: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
b2f0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
b300: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
b310: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
b320: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
b330: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
b340: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
b350: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
b360: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
b370: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
b380: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
b390: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
b3a0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
b3b0: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
b3c0: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
b3d0: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
b3e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
b3f0: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
b400: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b410: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
b420: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
b430: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
b440: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
b450: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
b460: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
b470: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
b480: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
b490: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
b4a0: 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  mes..  */.  asse
b4b0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
b4c0: 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f  ect ); /* If nCo
b4d0: 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c  l==0, then pTabl
b4e0: 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57  e must be a VIEW
b4f0: 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61   */.  pSel = pTa
b500: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  ble->pSelect;.. 
b510: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   /* Note that th
b520: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
b530: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
b540: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
b550: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
b560: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
b570: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
b580: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
b590: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
b5a0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
b5b0: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
b5c0: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
b5d0: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
b5e0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
b5f0: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
b600: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
b610: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
b620: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
b630: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
b640: 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  up(pEList);.  if
b650: 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d  ( pSel->pEList==
b660: 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  0 ){.    pSel->p
b670: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
b680: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
b690: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
b6a0: 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  */.  }.  pTable-
b6b0: 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53  >nCol = -1;.  pS
b6c0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
b6d0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
b6e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
b6f0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  );.  if( pSelTab
b700: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b710: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
b720: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
b730: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
b740: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
b750: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
b760: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
b770: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
b780: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
b790: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
b7a0: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
b7b0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53  SelTab);.    DbS
b7c0: 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73  etProperty(pPars
b7d0: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69  e->db, pTable->i
b7e0: 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  Db, DB_UnresetVi
b7f0: 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ews);.  }else{. 
b800: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
b810: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
b820: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
b830: 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29  lectUnbind(pSel)
b840: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
b850: 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  istDelete(pSel->
b860: 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d  pEList);.  pSel-
b870: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
b880: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
b890: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61    .}../*.** Clea
b8a0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
b8b0: 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57  es from the VIEW
b8c0: 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   pTable..**.** T
b8d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b8e0: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
b8f0: 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f  ny other table o
b900: 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69  r view is modifi
b910: 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20  ed..** The view 
b920: 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
b930: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
b940: 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f  epend directly o
b950: 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20  r indirectly.** 
b960: 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20  on the modified 
b970: 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  or deleted table
b980: 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63   so we need to c
b990: 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c  lear the old col
b9a0: 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20  umn.** names so 
b9b0: 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
b9c0: 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  e recomputed..*/
b9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
b9e0: 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75  iteViewResetColu
b9f0: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
ba00: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
ba10: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
ba20: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
ba30: 65 21 3d 30 20 26 26 20 70 54 61 62 6c 65 2d 3e  e!=0 && pTable->
ba40: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
ba50: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
ba60: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  able->aCol; i<pT
ba70: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
ba80: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
ba90: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
baa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
bab0: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c  eFree(pCol->zDfl
bac0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
bad0: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
bae0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
baf0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
bb00: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
bb10: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
bb20: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
bb30: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
bb40: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
bb50: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
bb60: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
bb70: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
bb80: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
bb90: 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  te *db, int idx)
bba0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
bbb0: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
bbc0: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
bbd0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
bbe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
bbf0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
bc00: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
bc10: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
bc20: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
bc30: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
bc40: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
bc50: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
bc60: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
bc70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65  .      sqliteVie
bc80: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
bc90: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
bca0: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
bcb0: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
bcc0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
bcd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
bce0: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
bcf0: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
bd00: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
bd10: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
bd20: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
bd30: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
bd40: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
bd50: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
bd60: 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  e3TableFromToken
bd70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
bd80: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
bd90: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
bda0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e  able *pTab;.  zN
bdb0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62  ame = sqlite3Tab
bdc0: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
bdd0: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
bde0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
bdf0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
be00: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
be10: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  se->db, zName, 0
be20: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
be30: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
be40: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
be50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
be60: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
be70: 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29 3b  ble: %T", pTok);
be80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
be90: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
bea0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
beb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bec0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bed0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
bee0: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
bef0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
bf00: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
bf10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
bf20: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
bf30: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
bf40: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
bf50: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
bf60: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
bf70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
bf80: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
bf90: 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20   base;.  sqlite 
bfa0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bfb0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
bfc0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
bfd0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
bfe0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
bff0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
c000: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
c010: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
c020: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
c030: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
c040: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
c050: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
c060: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
c070: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
c080: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
c090: 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  le;.  iDb = pTab
c0a0: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
c0b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
c0c0: 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65  b->nDb );.#ifnde
c0d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c0e0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
c0f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
c100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
c110: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
c120: 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  E(pTab->iDb);.  
c130: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
c140: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
c150: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
c160: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
c170: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
c180: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
c190: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
c1a0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c1b0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
c1c0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
c1d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
c1e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
c1f0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
c200: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
c210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c220: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
c230: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
c240: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
c250: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
c260: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
c270: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
c280: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
c290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
c2a0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
c2b0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
c2c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
c2d0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
c2e0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
c2f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
c300: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
c310: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
c320: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
c330: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
c340: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
c350: 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
c360: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
c370: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c380: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
c390: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c3a0: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
c3b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c3c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c3d0: 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
c3e0: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
c3f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
c400: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c410: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c420: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
c430: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
c440: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
c450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c460: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
c470: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
c480: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
c490: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
c4a0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
c4b0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
c4c0: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
c4d0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
c4e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c4f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
c500: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
c510: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
c520: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
c530: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c540: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _table;.  }..  /
c550: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c560: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
c570: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
c580: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
c590: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
c5a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c5b0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
c5c0: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
c5d0: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
c5e0: 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  Table[] = {.    
c5f0: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
c600: 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20     0, ADDR(13), 
c610: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
c620: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c  tring8,    0, 0,
c630: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31          0}, /* 1
c640: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
c650: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
c660: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
c670: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
c680: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
c690: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
c6a0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
c6b0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
c6c0: 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  0}, /* sqlite_ma
c6d0: 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f  ster.tbl_name */
c6e0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
c6f0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
c700: 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  12), 0},.      {
c710: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
c720: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 74 72  0, 0,        "tr
c730: 69 67 67 65 72 22 7d 2c 0a 20 20 20 20 20 20 7b  igger"},.      {
c740: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
c750: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
c760: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
c770: 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20  r.type */.      
c780: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
c790: 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d   0, ADDR(12), 0}
c7a0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
c7b0: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
c7c0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
c7d0: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
c7e0: 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d   0, ADDR(13), 0}
c7f0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74  ,.      { OP_Got
c800: 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  o,       0, ADDR
c810: 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (3),  0},.      
c820: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
c830: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
c840: 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7d  , /* 12 */.    }
c850: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
c860: 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  x;.    Trigger *
c870: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71  pTrigger;.    sq
c880: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
c890: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
c8a0: 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a   0, pTab->iDb);.
c8b0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
c8c0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
c8d0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
c8e0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
c8f0: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
c900: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
c910: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
c920: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
c930: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
c940: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
c950: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
c960: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
c970: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
c980: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
c990: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
c9a0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
c9b0: 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  er->iDb==pTab->i
c9c0: 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e  Db || pTrigger->
c9d0: 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  iDb==1 );.      
c9e0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
c9f0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
ca00: 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  rigger, 1);.    
ca10: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
ca20: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
ca30: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
ca40: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
ca50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca60: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
ca70: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
ca80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ca90: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
caa0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
cab0: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
cac0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
cad0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
cae0: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
caf0: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
cb00: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
cb10: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
cb20: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
cb30: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
cb40: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
cb50: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
cb60: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
cb70: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
cb80: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
cb90: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
cba0: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
cbb0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
cbc0: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
cbd0: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
cbe0: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
cbf0: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
cc00: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
cc10: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
cc20: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
cc30: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73  b->iDb);.    bas
cc40: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
cc50: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
cc60: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
cc70: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
cc80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cc90: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
cca0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
ccb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
ccc0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
ccd0: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
cce0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ccf0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
cd00: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69  , 0);.    if( !i
cd10: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
cd20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cd30: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
cd40: 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  Tab->tnum, pTab-
cd50: 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  >iDb);.      for
cd60: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
cd70: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
cd80: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
cd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cda0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
cdb0: 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  roy, pIdx->tnum,
cdc0: 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20   pIdx->iDb);.   
cdd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
cde0: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
cdf0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
ce00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
ce10: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
ce20: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
ce30: 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  he table..  **. 
ce40: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69   ** Exception: i
ce50: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
ce60: 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74  ent began with t
ce70: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
ce80: 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f  rd,.  ** then no
ce90: 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20   changes should 
cea0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
ceb0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
cec0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
ced0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
cee0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
cef0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
cf00: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
cf10: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73  Changes;.  }.  s
cf20: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
cf30: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
cf40: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
cf50: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
cf60: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
cf70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cf80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
cf90: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
cfa0: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
cfb0: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
cfc0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
cfd0: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
cfe0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
cff0: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
d000: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
d010: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
d020: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
d030: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
d040: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
d050: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
d060: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
d070: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
d080: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
d090: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
d0a0: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
d0b0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
d0c0: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
d0d0: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
d0e0: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
d0f0: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
d100: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
d110: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
d120: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
d130: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
d140: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
d150: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
d160: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
d170: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
d180: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
d190: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
d1a0: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
d1b0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
d1c0: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
d1d0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
d1e0: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
d1f0: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
d200: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
d210: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
d220: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
d230: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
d240: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
d250: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
d260: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
d270: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
d280: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
d290: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
d2a0: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
d2b0: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
d2c0: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
d2d0: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
d2e0: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
d2f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d300: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
d310: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d320: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
d330: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d340: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
d350: 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
d360: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
d370: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
d380: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
d390: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
d3a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
d3b0: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
d3c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
d3d0: 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
d3e0: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
d3f0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
d400: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
d410: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
d420: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
d430: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
d440: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
d450: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
d460: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
d470: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
d480: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
d490: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
d4a0: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
d4b0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
d4c0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
d4d0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
d4e0: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
d4f0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
d500: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
d510: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
d520: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
d530: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
d540: 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
d550: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d560: 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
d570: 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
d580: 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
d590: 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
d5a0: 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
d5b0: 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
d5c0: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
d5d0: 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
d5e0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
d5f0: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
d600: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
d610: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
d620: 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
d630: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
d640: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d650: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
d660: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
d670: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
d680: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
d690: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
d6a0: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
d6b0: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
d6c0: 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
d6d0: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
d6e0: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
d6f0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
d700: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
d710: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
d720: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
d730: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
d740: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
d750: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
d760: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
d770: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d780: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
d790: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
d7a0: 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
d7b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
d7c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
d7d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
d7e0: 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66  FKey==0 ) goto f
d7f0: 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e  k_end;.  pFKey->
d800: 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
d810: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
d820: 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
d830: 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
d840: 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
d850: 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
d860: 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
d870: 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
d880: 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
d890: 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
d8a0: 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
d8b0: 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
d8c0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
d8d0: 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
d8e0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
d8f0: 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
d900: 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
d910: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
d920: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
d930: 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
d940: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
d950: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
d960: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
d970: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
d980: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
d990: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
d9a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
d9b0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
d9c0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
d9d0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
d9e0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
d9f0: 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
da00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
da10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
da30: 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
da40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
da50: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
da60: 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
da70: 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
da80: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
da90: 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
daa0: 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
dab0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
dac0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dae0: 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
daf0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
db00: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
db10: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
db20: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
db30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
db40: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
db50: 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
db60: 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
db70: 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
db80: 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
db90: 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
dba0: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
dbb0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
dbc0: 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
dbd0: 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
dbe0: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
dbf0: 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
dc00: 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
dc10: 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
dc20: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
dc30: 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
dc40: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
dc50: 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
dc60: 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
dc70: 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
dc80: 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
dc90: 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
dca0: 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
dcb0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71  ree(pFKey);.  sq
dcc0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
dcd0: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
dce0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dcf0: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
dd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
dd10: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
dd20: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
dd30: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
dd40: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
dd50: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
dd60: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
dd70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
dd80: 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
dd90: 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
dda0: 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
ddb0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ddc0: 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
ddd0: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
dde0: 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
ddf0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
de00: 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
de10: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
de20: 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
de30: 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
de40: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
de50: 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
de60: 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
de70: 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ed){.  Table *pT
de80: 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
de90: 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
dea0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
deb0: 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
dec0: 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
ded0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
dee0: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
def0: 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d   = isDeferred;.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
df10: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
df20: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
df30: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
df40: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
df50: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
df60: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
df70: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
df80: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
df90: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
dfa0: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
dfb0: 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
dfc0: 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
dfd0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
dfe0: 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
dff0: 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
e000: 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
e010: 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
e020: 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
e030: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
e040: 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
e050: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
e060: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
e070: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
e080: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
e090: 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
e0a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
e0b0: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
e0c0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
e0d0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
e0e0: 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
e0f0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
e100: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
e110: 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
e120: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
e130: 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
e140: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
e150: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
e160: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
e170: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e180: 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
e190: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e1a0: 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
e1b0: 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
e1c0: 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
e1d0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
e1e0: 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
e1f0: 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
e200: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
e210: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
e220: 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
e230: 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
e240: 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
e250: 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54  *pTblName,  /* T
e260: 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
e270: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
e280: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
e290: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
e2a0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
e2b0: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
e2c0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
e2d0: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
e2e0: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
e2f0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
e300: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
e310: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
e320: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
e330: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
e340: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e350: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
e360: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
e370: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
e380: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
e390: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
e3a0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
e3b0: 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62  pTab = 0; /* Tab
e3c0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
e3d0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
e3e0: 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  dex;   /* The in
e3f0: 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
e400: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
e410: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
e420: 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
e430: 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74  Id;    /* Fake t
e440: 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
e450: 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
e460: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
e470: 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
e480: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
e490: 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
e4a0: 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20  nt isTemp;      
e4b0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74 65  /* True for a te
e4c0: 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f  mporary index */
e4d0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
e4e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
e4f0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
e500: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
e510: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
e520: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
e530: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
e540: 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c  e = 0; /* Unqual
e550: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
e560: 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
e570: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72  e */..  if( pPar
e580: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
e590: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
e5a0: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
e5b0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
e5c0: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
e5d0: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
e5e0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
e5f0: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
e600: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
e610: 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
e620: 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
e630: 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
e640: 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
e650: 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
e660: 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
e670: 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
e680: 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
e690: 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
e6a0: 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
e6b0: 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
e6c0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
e6d0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
e6e0: 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
e6f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
e700: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
e710: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
e720: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
e730: 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
e740: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e750: 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  x;..    /* If th
e760: 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
e770: 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
e780: 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
e790: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
e7a0: 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
e7b0: 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
e7c0: 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a  base to 1..    *
e7d0: 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  /.    pTab = sql
e7e0: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
e7f0: 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
e800: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61  me);.    if( pNa
e810: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
e820: 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
e830: 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20  Tab->iDb==1 ){. 
e840: 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
e850: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c    }..    if( sql
e860: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
e870: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
e880: 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
e890: 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
e8a0: 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
e8b0: 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
e8c0: 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
e8d0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e8e0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  x;.    }.    pTa
e8f0: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
e900: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
e910: 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
e920: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
e930: 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
e940: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
e950: 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
e960: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
e970: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
e980: 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20  ==pTab->iDb );. 
e990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
e9a0: 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
e9b0: 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72      pTab =  pPar
e9c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
e9d0: 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69     iDb = pTab->i
e9e0: 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  Db;.  }..  if( p
e9f0: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
ea00: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
ea10: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ea20: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
ea30: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
ea40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ea50: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
ea60: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
ea70: 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
ea80: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
ea90: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
eaa0: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  }.  if( pTab->pS
eab0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
eac0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ead0: 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
eae0: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
eaf0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
eb00: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
eb10: 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61  }.  isTemp = pTa
eb20: 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a  b->iDb==1;..  /*
eb30: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
eb40: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
eb50: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
eb60: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
eb70: 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
eb80: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
eb90: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
eba0: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
ebb0: 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
ebc0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
ebd0: 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
ebe0: 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
ebf0: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
ec00: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
ec10: 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
ec20: 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
ec30: 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
ec40: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
ec50: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
ec60: 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
ec70: 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
ec80: 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
ec90: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
eca0: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
ecb0: 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
ecc0: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
ecd0: 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
ece0: 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
ecf0: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
ed00: 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
ed10: 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
ed20: 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
ed30: 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
ed40: 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
ed50: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20  .  if( pName && 
ed60: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
ed70: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53  {.    Index *pIS
ed80: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
ed90: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
eda0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
edb0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
edc0: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
edd0: 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
ede0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
edf0: 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65  dex */.    zName
ee00: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
ee10: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
ee20: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ->n);.    if( zN
ee30: 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
ee40: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ee50: 0a 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65  .    if( (pISame
ee60: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Name = sqlite3Fi
ee70: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
ee80: 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e, db->aDb[iDb].
ee90: 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20  zName))!=0 ){.  
eea0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
eeb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
eec0: 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
eed0: 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
eee0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
eef0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
ef00: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53 61   }.    if( (pTSa
ef10: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
ef20: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
ef30: 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  ame, 0))!=0 ){. 
ef40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ef50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
ef60: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
ef70: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
ef80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
ef90: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
efa0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
efb0: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d  }else if( pName=
efc0: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
efd0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
efe0: 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
eff0: 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
f000: 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
f010: 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
f020: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
f030: 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
f040: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c  intf(zBuf,"%d)",
f050: 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
f060: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
f070: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
f080: 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  "(", pTab->zName
f090: 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c  , " autoindex ",
f0a0: 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
f0b0: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
f0c0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
f0d0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
f0e0: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
f0f0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
f100: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
f110: 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  >n);.  }..  /* C
f120: 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
f130: 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
f140: 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
f150: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f160: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
f170: 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
f180: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
f190: 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
f1a0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
f1b0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f1c0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
f1d0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
f1e0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
f1f0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
f200: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
f210: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
f220: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
f230: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
f240: 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c  isTemp ) i = SQL
f250: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
f260: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
f270: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f280: 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
f290: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
f2a0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
f2b0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
f2c0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
f2d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
f2e0: 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
f2f0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
f300: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
f310: 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
f320: 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
f330: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
f340: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
f350: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
f360: 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
f370: 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
f380: 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
f390: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
f3a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
f3b0: 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
f3c0: 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
f3d0: 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
f3e0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c  .n = strlen(null
f3f0: 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
f400: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
f410: 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26  stAppend(0, 0, &
f420: 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
f430: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
f440: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
f450: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
f460: 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
f470: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
f480: 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
f490: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
f4a0: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
f4b0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
f4c0: 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
f4e0: 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
f4f0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c  of(CollSeq*))*pL
f500: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
f510: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20  if( pIndex==0 ) 
f520: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
f530: 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78  _index;.  pIndex
f540: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
f550: 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  t*)&pIndex->keyI
f560: 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d  nfo.aColl[pList-
f570: 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65  >nExpr];.  pInde
f580: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
f590: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
f5a0: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  umn[pList->nExpr
f5b0: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
f5c0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
f5d0: 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
f5e0: 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
f5f0: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
f600: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
f610: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
f620: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  = onError;.  pIn
f630: 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
f640: 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e   pName==0;.  pIn
f650: 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  dex->iDb = iDb;.
f660: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
f670: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
f680: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
f690: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
f6a0: 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
f6b0: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
f6c0: 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
f6d0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
f6e0: 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
f6f0: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
f700: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
f710: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
f720: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
f730: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
f740: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
f750: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
f760: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
f770: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
f780: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
f790: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
f7a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
f7b0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
f7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f7d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
f7e0: 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f  ble %s has no co
f7f0: 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a  lumn named %s",.
f800: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
f810: 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  ame, pList->a[i]
f820: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  .zName);.      s
f830: 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
f840: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
f850: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f860: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
f870: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
f880: 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
f890: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b  t->a[i].pExpr ){
f8a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f8b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
f8c0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
f8d0: 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
f8e0: 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73  .aColl[i] = pLis
f8f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
f900: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
f910: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
f920: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
f930: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
f940: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  pColl;.    }.   
f950: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
f960: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
f970: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ] );.    if( !db
f980: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a  ->init.busy && .
f990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
f9a0: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
f9b0: 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  se, pIndex->keyI
f9c0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20  nfo.aColl[i]) . 
f9d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
f9e0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
f9f0: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ex;.    }.  }.  
fa00: 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
fa10: 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e  nField = pList->
fa20: 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  nExpr;..  /* Lin
fa30: 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
fa40: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
fa50: 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
fa60: 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
fa70: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
fa80: 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
fa90: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
faa0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
fab0: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
fac0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
fad0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e  ert(&db->aDb[pIn
fae0: 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  dex->iDb].idxHas
faf0: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
fb10: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
fb20: 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
fb30: 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
fb40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
fb50: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
fb60: 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
fb70: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
fb80: 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
fb90: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
fba0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
fbb0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
fbc0: 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
fbd0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
fbe0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20  nChanges;.  }.. 
fbf0: 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
fc00: 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
fc10: 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
fc20: 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
fc30: 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
fc40: 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
fc50: 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
fc60: 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
fc70: 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
fc80: 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
fc90: 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
fca0: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
fcb0: 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
fcc0: 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
fcd0: 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72    */.  if( onErr
fce0: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
fcf0: 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
fd00: 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62  0.       || pTab
fd10: 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
fd20: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
fd30: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
fd40: 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
fd50: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64  ;.    pTab->pInd
fd60: 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d  ex = pIndex;.  }
fd70: 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20  else{.    Index 
fd80: 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
fd90: 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c  pIndex;.    whil
fda0: 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
fdb0: 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
fdc0: 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
fdd0: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
fde0: 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
fdf0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
fe00: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
fe10: 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
fe20: 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65  .    pOther->pNe
fe30: 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d  xt = pIndex;.  }
fe40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
fe50: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
fe60: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
fe70: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
fe80: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
fe90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
fea0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
feb0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
fec0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
fed0: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
fee0: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
fef0: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ber from the db-
ff00: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
ff10: 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eld..  */.  if( 
ff20: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
ff30: 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
ff40: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
ff50: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
ff60: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
ff70: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
ff80: 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
ff90: 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
ffa0: 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
ffb0: 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
ffc0: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
ffd0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
ffe0: 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
fff0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
10000 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
10010 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
10020 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
10030 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
10040 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
10050 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
10060 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
10070 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
10080 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
10090 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
100a0 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
100b0 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
100c0 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
100d0 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
100e0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
100f0 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
10100 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
10110 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
10120 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
10130 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
10140 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
10150 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
10160 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
10170 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
10180 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
10190 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
101a0 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
101b0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
101c0 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
101d0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
101e0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
101f0 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
10200 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
10210 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
10220 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
10230 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
10240 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
10250 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
10260 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
10270 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  y==0 ){.    int 
10280 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
10290 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62      int lbl1, lb
102a0 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  l2;..    v = sql
102b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
102c0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
102d0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
102e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
102f0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
10300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10310 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
10320 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
10330 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10340 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
10350 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  e(v, iDb);.    }
10360 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10370 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
10380 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
10390 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
103a0 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
103b0 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33  , 0, "index", P3
103c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
103d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
103e0 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
103f0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
10400 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10410 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
10420 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54 61  ring8, 0, 0, pTa
10430 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
10440 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
10450 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
10460 65 78 2c 20 30 2c 20 69 44 62 2c 28 63 68 61 72  ex, 0, iDb,(char
10470 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  *)&pIndex->tnum,
10480 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
10490 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
104a0 30 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  0;.    if( pTblN
104b0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
104c0 69 74 65 33 56 64 62 65 43 6f 64 65 28 76 2c 0a  ite3VdbeCode(v,.
104d0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 44 75 70            OP_Dup
104e0 2c 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20  ,       0,      
104f0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  0,.          OP_
10500 49 6e 74 65 67 65 72 2c 20 20 20 69 44 62 2c 20  Integer,   iDb, 
10510 20 20 20 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a     0,.      0);.
10520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10530 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
10540 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20  rite, 1, 0,.    
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10560 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
10570 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
10580 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  INFO);.    }.   
10590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
105a0 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
105b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
105c0 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
105d0 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72  {.      if( onEr
105e0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror==OE_None ){.
105f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10600 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
10610 31 2c 20 22 43 52 45 41 54 45 20 49 4e 44 45 58  1, "CREATE INDEX
10620 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a   ", P3_STATIC);.
10630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10650 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10660 22 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49  "CREATE UNIQUE I
10670 4e 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49  NDEX ", P3_STATI
10680 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
10690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
106a0 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
106b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e  , 0, 0);.      n
106c0 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
106d0 20 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a   - Addr(pName->z
106e0 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
106f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
10700 28 76 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a  (v, -1, pName->z
10710 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
10720 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10730 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29  OP_Concat, 2, 0)
10740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10750 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10760 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
10770 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53  0, "tttit", P3_S
10780 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
10790 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
107a0 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
107b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62   0);.    if( pTb
107c0 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
107d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
107e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
107f0 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Tab->iDb, 0);.  
10800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10810 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
10820 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  ead, 2, pTab->tn
10830 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64  um);.      /* Vd
10840 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
10850 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
10860 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
10870 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10880 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10890 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  , 2, pTab->nCol)
108a0 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73  ;.      lbl2 = s
108b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
108c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
108d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
108e0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20  , OP_Rewind, 2, 
108f0 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c  lbl2);.      lbl
10900 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
10910 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
10920 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
10930 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
10940 70 49 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20 20  pIndex, 2);.    
10950 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
10960 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31  (v, OP_IdxPut, 1
10970 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  , pIndex->onErro
10980 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20  r!=OE_None,.    
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
109b0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
109c0 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
109d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
109f0 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
10a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10a10 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
10a20 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l2);.      sqlit
10a30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10a40 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a  P_Close, 2, 0);.
10a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10a70 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  se, 1, 0);.    }
10a80 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
10a90 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e!=0 ){.      if
10aa0 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
10ab0 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
10ac0 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
10ad0 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
10ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10af0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10b00 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
10b10 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
10b20 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
10b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10b40 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
10b50 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
10b60 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
10b70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10b80 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
10b90 20 2f 2a 20 73 71 6c 69 74 65 33 53 72 63 4c 69   /* sqlite3SrcLi
10ba0 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 29  stDelete(pTable)
10bb0 3b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65  ; */.  sqliteFre
10bc0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
10bd0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
10be0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
10bf0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
10c00 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
10c10 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
10c20 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
10c30 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
10c40 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
10c50 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
10c60 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
10c70 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
10c80 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
10c90 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10ca0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10cb0 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
10cc0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
10cd0 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
10ce0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
10cf0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
10d00 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  =1 );.  pIndex =
10d10 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
10d20 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
10d30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
10d40 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
10d50 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
10d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10d70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10d80 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
10d90 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
10da0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
10db0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
10dc0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10dd0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
10de0 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
10df0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
10e00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10e10 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
10e20 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
10e30 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
10e40 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
10e50 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
10e60 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
10e70 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
10e80 64 65 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66  dex;.  }./*.  if
10e90 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20  ( pIndex->iDb>1 
10ea0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10eb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10ec0 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68  cannot alter sch
10ed0 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65 64 20  ema of attached 
10ee0 22 0a 20 20 20 20 20 20 20 22 64 61 74 61 62 61  ".       "databa
10ef0 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ses", 0);.    go
10f00 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
10f10 65 78 3b 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64  ex;.  }.*/.#ifnd
10f20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10f30 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
10f40 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
10f50 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
10f60 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
10f70 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
10f80 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
10f90 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
10fa0 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
10fb0 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
10fc0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
10fd0 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65  HEMA_TABLE(pInde
10fe0 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28  x->iDb);.    if(
10ff0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
11000 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
11010 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
11020 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
11030 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11040 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
11050 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  if( pIndex->iDb 
11060 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
11070 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
11080 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11090 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
110a0 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
110b0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
110c0 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
110d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
110e0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
110f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
11100 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
11110 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
11120 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
11130 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
11140 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11150 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11160 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
11170 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  c VdbeOpList dro
11180 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20  pIndex[] = {.   
11190 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
111a0 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
111b0 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0}, .      { OP_
111c0 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20  String8,     0, 
111d0 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
111e0 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
111f0 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
11200 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
11210 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
11220 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30     1, 0,       0
11230 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
11240 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
11250 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    0, 1,       0}
11260 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c  ,.      { OP_Eq,
11270 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
11280 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (8), 0},.      {
11290 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
112a0 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a  0, ADDR(3), 0},.
112b0 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
112c0 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
112d0 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
112e0 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
112f0 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
11300 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   8 */.    };.   
11310 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20   int base;..    
11320 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
11330 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
11340 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44  e, 0, pIndex->iD
11350 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  b);.    sqlite3O
11360 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
11370 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
11380 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
11390 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
113a0 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
113b0 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
113c0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
113d0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
113e0 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e  base+1, pIndex->
113f0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
11400 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 21 3d  f( pIndex->iDb!=
11410 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
11420 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
11430 62 2c 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44  b, v, pIndex->iD
11440 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
11450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11460 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
11470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11480 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
11490 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74  stroy, pIndex->t
114a0 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
114b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
114c0 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
114d0 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
114e0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
114f0 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
11500 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65  ion of this inde
11510 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  x..  */.  if( !p
11520 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
11530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 6c  {.    sqlite3Unl
11540 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
11550 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
11560 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
11570 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
11580 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  nges;.  }..exit_
11590 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
115a0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
115b0 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
115c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
115d0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
115e0 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
115f0 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
11600 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
11610 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
11620 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
11630 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
11640 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
11650 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
11660 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
11670 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
11680 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
11690 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
116a0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
116b0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
116c0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
116d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
116e0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
116f0 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
11700 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  .  if( pList->nI
11710 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  d>=pList->nAlloc
11720 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49   ){.    struct I
11730 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  dList_item *a;. 
11740 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
11750 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
11760 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20  *2 + 5;.    a = 
11770 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
11780 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
11790 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
117a0 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
117b0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
117c0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
117d0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
117e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
117f0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
11800 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
11810 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
11820 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
11830 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
11840 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  ));.  if( pToken
11850 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
11860 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
11870 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b  ist->nId].zName;
11880 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
11890 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65  String(pz, pToke
118a0 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c  n->z, pToken->n,
118b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
118c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
118d0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
118e0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
118f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
11900 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
11910 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  3Dequote(*pz);. 
11920 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
11930 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
11940 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
11950 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
11960 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
11970 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
11980 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
11990 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
119a0 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
119b0 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
119c0 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
119d0 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
119e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  LL..**.** A new 
119f0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
11a00 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
11a10 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
11a20 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
11a30 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
11a40 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
11a50 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
11a60 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
11a70 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
11a80 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
11a90 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
11aa0 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
11ab0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
11ac0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
11ad0 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
11ae0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11af0 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
11b00 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
11b10 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
11b20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
11b30 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
11b40 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
11b50 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
11b60 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
11b70 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
11b80 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
11b90 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
11ba0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
11bb0 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
11bc0 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
11bd0 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
11be0 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
11bf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
11c00 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
11c10 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
11c20 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
11c30 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
11c40 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
11c50 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
11c60 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
11c70 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
11c80 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
11c90 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
11ca0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
11cb0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
11cc0 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a  Append(A,B,C);.*
11cd0 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
11ce0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
11cf0 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
11d00 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
11d10 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
11d20 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69  ListAppend(SrcLi
11d30 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
11d40 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20   *pTable, Token 
11d50 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69  *pDatabase){.  i
11d60 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
11d70 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
11d80 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
11d90 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
11da0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
11db0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
11dc0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
11dd0 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
11de0 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
11df0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
11e00 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
11e10 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
11e20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
11e30 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
11e40 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
11e50 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
11e60 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
11e70 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
11e80 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
11e90 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
11ea0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
11eb0 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
11ec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
11ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
11ee0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
11ef0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
11f00 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30  [pList->nSrc], 0
11f10 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
11f20 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
11f30 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
11f40 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
11f50 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
11f60 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
11f70 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
11f80 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
11f90 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
11fa0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
11fb0 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
11fc0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
11fd0 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
11fe0 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
11ff0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
12000 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  >nSrc].zName;.  
12010 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
12020 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e  ing(pz, pTable->
12030 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29  z, pTable->n, 0)
12040 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
12050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12060 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
12070 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
12080 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
12090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
120a0 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
120b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61   }.  }.  if( pDa
120c0 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68  tabase ){.    ch
120d0 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
120e0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
120f0 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20  .zDatabase;.    
12100 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
12110 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d  g(pz, pDatabase-
12120 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e  >z, pDatabase->n
12130 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
12140 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
12150 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
12160 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
12170 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
12180 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
12190 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  te3Dequote(*pz);
121a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
121b0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
121c0 63 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  c].iCursor = -1;
121d0 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b  .  pList->nSrc++
121e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
121f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
12200 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  n cursors to all
12210 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
12220 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
12230 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
12240 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
12250 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
12260 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
12270 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12280 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
12290 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  {.    if( pList-
122a0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20  >a[i].iCursor<0 
122b0 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
122c0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70  a[i].iCursor = p
122d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
122e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
122f0 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
12300 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
12310 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
12320 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
12330 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
12340 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69  te3SrcListAddAli
12350 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
12360 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
12370 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
12380 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
12390 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
123a0 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a  List->nSrc - 1;.
123b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
123c0 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b  tring(&pList->a[
123d0 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65  i].zAlias, pToke
123e0 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c  n->z, pToken->n,
123f0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12400 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61  Dequote(pList->a
12410 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  [i].zAlias);.  }
12420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
12430 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
12440 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
12450 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
12460 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
12470 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
12480 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
12490 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
124a0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
124b0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
124c0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
124d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
124e0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
124f0 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
12500 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12510 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
12520 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
12530 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
12540 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
12550 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
12560 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
12570 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
12580 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
12590 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
125a0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
125b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
125c0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
125d0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
125e0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
125f0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
12600 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
12610 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
12620 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
12630 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
12640 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
12650 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
12660 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
12670 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
12680 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73  istDelete(SrcLis
12690 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
126a0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
126b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
126c0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
126d0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
126e0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
126f0 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73  t->a[i].zDatabas
12700 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
12710 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
12720 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
12730 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
12740 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ].zAlias);.    i
12750 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  f( pList->a[i].p
12760 54 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  Tab && pList->a[
12770 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  i].pTab->isTrans
12780 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
12790 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
127a0 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
127b0 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
127c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
127d0 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
127e0 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  .pSelect);.    s
127f0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
12800 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e  (pList->a[i].pOn
12810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
12820 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
12830 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a  ->a[i].pUsing);.
12840 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
12850 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
12860 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
12870 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
12880 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
12890 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
128a0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
128b0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
128c0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
128d0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
128e0 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
128f0 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
12900 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
12910 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
12920 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
12930 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
12940 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
12950 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
12960 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
12970 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
12980 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
12990 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
129a0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
129b0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
129c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
129d0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
129e0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
129f0 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
12a00 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
12a10 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
12a20 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
12a30 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
12a40 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
12a50 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
12a60 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
12a70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
12a80 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
12a90 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
12aa0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
12ab0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
12ac0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
12ad0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12ae0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
12af0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
12b00 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65  MIT", 0, 0) ) re
12b10 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
12b20 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12b30 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
12b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b50 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
12b60 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
12b70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
12b80 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
12b90 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
12ba0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
12bb0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
12bc0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
12bd0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
12be0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
12bf0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
12c00 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
12c10 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
12c20 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
12c30 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
12c40 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
12c50 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
12c60 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
12c70 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
12c80 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
12c90 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
12ca0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
12cb0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12cc0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
12cd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12ce0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
12cf0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
12d00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
12d10 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
12d20 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
12d30 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
12d40 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
12d50 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
12d60 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
12d70 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
12d80 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
12d90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
12da0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
12db0 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
12dc0 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
12dd0 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
12de0 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
12df0 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
12e00 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
12e10 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
12e20 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
12e30 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
12e40 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
12e50 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
12e60 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
12e70 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
12e80 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
12e90 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
12ea0 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
12eb0 64 65 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74  de an OP_Gosub t
12ec0 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
12ed0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
12ee0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
12ef0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
12f00 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
12f10 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
12f20 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
12f30 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
12f40 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
12f50 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
12f60 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
12f70 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
12f80 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
12f90 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
12fa0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
12fb0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
12fc0 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
12fd0 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
12fe0 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
12ff0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
13000 6f 73 75 62 20 50 32 20 76 61 6c 75 65 0a 2a 2a  osub P2 value.**
13010 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
13020 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
13030 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
13040 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
13050 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
13060 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
13070 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
13080 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
13090 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f  hCoding()..*/.vo
130a0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
130b0 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
130c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
130d0 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  b){.  sqlite *db
130e0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
130f0 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20  nt mask;..  v = 
13100 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13110 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
13120 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
13130 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
13140 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
13150 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
13160 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
13170 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  db;.  assert( iD
13180 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
13190 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
131a0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
131b0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
131c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
131d0 33 32 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  32 );.  if( pPar
131e0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 3d 3d  se->cookieMask==
131f0 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
13200 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
13210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13220 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
13230 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 31  ;.  }.  mask = 1
13240 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 28 70 50  <<iDb;.  if( (pP
13250 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
13260 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
13270 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
13280 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
13290 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
132a0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
132b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
132c0 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 7d 0a  a_cookie;.  }.}.
132d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
132e0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
132f0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
13300 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
13310 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
13320 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
13330 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13340 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
13350 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
13360 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
13370 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
13380 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
13390 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
133a0 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
133b0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
133c0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
133d0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
133e0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
133f0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
13400 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
13410 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
13420 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
13430 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
13440 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
13450 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
13460 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
13470 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
13480 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
13490 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
134a0 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
134b0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
134c0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
134d0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
134e0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
134f0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
13500 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
13510 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
13520 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
13530 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
13540 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
13550 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
13560 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
13570 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f   be set..**.** O
13580 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62  nly database iDb
13590 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
135a0 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
135b0 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73  writable by this
135c0 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62   call..** If iDb
135d0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ==0, then the ma
135e0 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61  in and temp data
135f0 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77  bases are made w
13600 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a  ritable.   If.**
13610 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c   iDb==1 then onl
13620 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  y the temp datab
13630 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  ase is made writ
13640 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20  able.  If iDb>1 
13650 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63  then the.** spec
13660 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20  ified auxiliary 
13670 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
13680 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
13690 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
136a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
136b0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
136c0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
136d0 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
136e0 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
136f0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13700 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13710 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
13720 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
13730 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
13740 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
13750 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
13760 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
13770 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
13780 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
13790 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
137a0 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
137b0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   0);.  }.  if( i
137c0 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  Db!=1 ){.    sql
137d0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
137e0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
137f0 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29  setStatement, 1)
13800 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
13810 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
13820 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f  t concludes an o
13830 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  peration that ma
13840 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a  y have changed.*
13850 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  * the database. 
13860 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   If a statement 
13870 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13880 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d  started, then em
13890 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d  it.** an OP_Comm
138a0 69 74 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75  it that will cau
138b0 73 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  se the changes t
138c0 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74  o be committed t
138d0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o disk..**.** No
138e0 74 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69  te that checkpoi
138f0 6e 74 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  nts are automati
13900 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20  cally committed 
13910 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  at the end of.**
13920 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e   a statement.  N
13930 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68  ote also that th
13940 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69  ere can be multi
13950 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  ple calls to .**
13960 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
13970 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75  teOperation() bu
13980 74 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f  t there should o
13990 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a  nly be a single.
139a0 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
139b0 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
139c0 69 6f 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e  ion() at the con
139d0 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  clusion of the s
139e0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
139f0 64 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74  d sqlite3EndWrit
13a00 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
13a10 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 2f 2a 20   *pParse){.  /* 
13a20 44 65 6c 65 74 65 20 6d 65 21 20 2a 2f 0a 20 20  Delete me! */.  
13a30 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.