/ Hex Artifact Content
Login

Artifact 5b91d41cbeed1da348a43a8af3eb5a7ce5812673:


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 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 38 33 20 32 30 30  ild.c,v 1.83 200
0310: 32 2f 30 33 2f 30 33 20 32 33 3a 30 36 3a 30 31  2/03/03 23:06:01
0320: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0330: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0340: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0350: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0360: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0370: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0380: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0390: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03a0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03b0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03c0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03d0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
03f0: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0400: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0410: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0420: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0430: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0440: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0450: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0460: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0470: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0480: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
0490: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04b0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04c0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04d0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04e0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
04f0: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0500: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0520: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0530: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0540: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0550: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0560: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0570: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0580: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
0590: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05a0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05b0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05d0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05e0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0610: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0630: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0640: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0650: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0660: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0670: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0680: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
0690: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06a0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06b0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06c0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06d0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06e0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0700: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0710: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0740: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0750: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0760: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0770: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0780: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
0790: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07a0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07c0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07d0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07e0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
07f0: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
0810: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0830: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0840: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0850: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0860: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0870: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0880: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0890: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
08a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
08b0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
08c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
08d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c    Table *p = sql
08e0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
08f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
0900: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
0910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
0920: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0930: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0940: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0950: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0960: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0970: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0980: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
0990: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
09a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
09b0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
09c0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
09d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
09e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73  {.  Index *p = s
09f0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0a00: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0a10: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0a20: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0a40: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0a50: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0a60: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0a70: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0a80: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0a90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0aa0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0ab0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0ac0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0ad0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0ae0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
0af0: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
0b00: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
0b10: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
0b20: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
0b30: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
0b40: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
0b50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
0b60: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0b70: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
0b80: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
0b90: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
0ba0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
0bb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
0bc0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
0bd0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
0be0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
0bf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
0c00: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
0c10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
0c20: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c30: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
0c40: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
0c50: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
0c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
0c70: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c80: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
0c90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
0cb0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0cc0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
0cd0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
0ce0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
0cf0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d00: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
0d10: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
0d20: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0d30: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
0d40: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
0d50: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
0d60: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
0d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
0d80: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
0d90: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
0da0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
0db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
0dc0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
0dd0: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
0de0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
0df0: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
0e00: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
0e10: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
0e20: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
0e30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
0e40: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
0e50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
0e60: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
0e70: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
0e80: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
0e90: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
0ea0: 78 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  x to the pending
0eb0: 20 44 52 4f 50 20 49 4e 44 45 58 20 71 75 65 75   DROP INDEX queu
0ec0: 65 20 69 66 20 69 74 20 68 61 73 0a 2a 2a 20 62  e if it has.** b
0ed0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  een committed.  
0ee0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 77 61  If this index wa
0ef0: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
0f00: 64 2c 20 74 68 65 6e 20 6a 75 73 74 0a 2a 2a 20  d, then just.** 
0f10: 64 65 6c 65 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  delete it..**.**
0f20: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
0f30: 70 65 6e 64 69 6e 67 20 64 72 6f 70 20 71 75 65  pending drop que
0f40: 75 65 20 61 72 65 20 64 65 6c 65 74 65 64 20 77  ue are deleted w
0f50: 68 65 6e 20 61 20 43 4f 4d 4d 49 54 20 69 73 0a  hen a COMMIT is.
0f60: 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  ** executed.  If
0f70: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75   a ROLLBACK occu
0f80: 72 73 2c 20 74 68 65 20 69 6e 64 69 63 65 73 20  rs, the indices 
0f90: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
0fa0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  nto.** the main 
0fb0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fd0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
0fe0: 6f 70 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  opIndex(sqlite *
0ff0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1000: 20 69 66 28 20 21 70 2d 3e 69 73 43 6f 6d 6d 69   if( !p->isCommi
1010: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  t ){.    sqliteU
1020: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1030: 64 65 78 28 64 62 2c 20 70 29 3b 0a 20 20 7d 65  dex(db, p);.  }e
1040: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1050: 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  pOld;.    pOld =
1060: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1070: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
1080: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
1090: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
10a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
10b0: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
10c0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
10d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10e0: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
10f0: 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a  , strlen(pOld->z
1100: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
1110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1120: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1130: 69 64 78 44 72 6f 70 2c 20 70 2c 20 30 2c 20 70  idxDrop, p, 0, p
1140: 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 72 6f 70  );.    p->isDrop
1150: 70 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ped = 1;.  }.}..
1160: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1170: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1180: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
1190: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
11a0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
11b0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11c0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
11d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
11e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
11f0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
1200: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
1210: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
1220: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
1230: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1240: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1250: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
1260: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1270: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1280: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
1290: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
12b0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
12c0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
12d0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
12e0: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
12f0: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
1300: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
1310: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
1320: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
1330: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
1340: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
1350: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
1360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
1370: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
1380: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  id sqliteDeleteT
1390: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
13a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
13b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65  .  int i;.  Inde
13c0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
13d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  t;.  if( pTable=
13e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
1400: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1420: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
1430: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
1440: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1450: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
1460: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1470: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
1480: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e  );.  }.  for(pIn
1490: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
14a0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
14b0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
14c0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
14d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
14e0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
14f0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
1500: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1510: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
1520: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1530: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
1540: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
1550: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
1560: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1570: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
1580: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
1590: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
15a0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
15b0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
15c0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
15d0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
15e0: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
15f0: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1600: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
1610: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
1620: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
1630: 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  pOld;.  assert( 
1640: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1650: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1660: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1670: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1680: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
16a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
16b0: 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49  );.  sqliteHashI
16c0: 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44 72  nsert(&db->tblDr
16d0: 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  op, p, 0, 0);.  
16e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
16f0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1700: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69 76 65  ** Move the give
1710: 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 70  n table to the p
1720: 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41 42 4c  ending DROP TABL
1730: 45 20 71 75 65 75 65 20 69 66 20 69 74 20 68 61  E queue if it ha
1740: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d 69 74  s.** been commit
1750: 74 65 64 2e 20 20 49 66 20 74 68 69 73 20 74 61  ted.  If this ta
1760: 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f  ble was never co
1770: 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6a 75  mmitted, then ju
1780: 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69 74 2e  st.** delete it.
1790: 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20 66 6f    Do the same fo
17a0: 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  r all its indice
17b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f  s..**.** Table o
17c0: 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65 75 65  n the drop queue
17d0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
17e0: 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69 6c 20  y deleted until 
17f0: 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74 61 74  a COMMIT.** stat
1800: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
1810: 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42 41 43  d.  If a ROLLBAC
1820: 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65 61 64  K occurs instead
1830: 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a 2a 2a   of a COMMIT,.**
1840: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   then the tables
1850: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1860: 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63  ue are moved bac
1870: 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a  k into the main.
1880: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ** hash table..*
1890: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18a0: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 54  litePendingDropT
18b0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
18c0: 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b 0a 20   Table *pTbl){. 
18d0: 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73 43 6f   if( !pTbl->isCo
18e0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
18f0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1900: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62 6c 29  eTable(db, pTbl)
1910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
1920: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
1930: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
1940: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c 64 20  pNext;.    pOld 
1950: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1960: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1970: 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74   pTbl->zName, st
1980: 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61 6d 65  rlen(pTbl->zName
1990: 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73 73 65  )+1,0);.    asse
19a0: 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c 20 29  rt( pOld==pTbl )
19b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
19c0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44  Insert(&db->tblD
19d0: 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20 70 54  rop, pTbl, 0, pT
19e0: 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  bl);.    for(pIn
19f0: 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49 6e 64  dex = pTbl->pInd
1a00: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a10: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  ex=pNext){.     
1a20: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
1a30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a40: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
1a50: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54  *.** Check all T
1a80: 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65  ables and Indexe
1a90: 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  s in the interna
1aa0: 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  l hash table and
1ab0: 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61   commit.** any a
1ac0: 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65  dditions or dele
1ad0: 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68  tions to those h
1ae0: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ash tables..**.*
1af0: 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67  * When executing
1b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e   CREATE TABLE an
1b10: 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  d CREATE INDEX s
1b20: 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54  tatements, the T
1b30: 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65  able.** and Inde
1b40: 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65  x structures are
1b50: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
1b60: 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ed to the hash t
1b70: 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68  ables, but.** th
1b80: 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65  e "isCommit" fie
1b90: 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20  ld is not set.  
1ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1bb0: 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  s those fields..
1bc0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1bd0: 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64  g DROP TABLE and
1be0: 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65   DROP INDEX, the
1bf0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1c00: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1c10: 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66 20 74  e moved out of t
1c20: 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78 48 61  blHash and idxHa
1c30: 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f 70 20  sh into tblDrop 
1c40: 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20 54 68  and idxDrop.  Th
1c50: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 65  is.** routine de
1c60: 6c 65 74 65 73 20 74 68 65 20 73 74 72 75 63 74  letes the struct
1c70: 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70 20 61  ure in tblDrop a
1c80: 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a 0a 2a  nd idxDrop..**.*
1c90: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
1ca0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1cb0: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
1cc0: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1cd0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1ce0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48  sqlite *db){.  H
1cf0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
1d00: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
1d10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
1d20: 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20 72 65  Changes)==0 ) re
1d30: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63 68 65  turn;.  db->sche
1d40: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1d50: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1d60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1d70: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1d80: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1d90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1da0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1db0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1dc0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1dd0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 61 62  pElem);.    pTab
1de0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  le->isCommit = 1
1df0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  ;.  }.  for(pEle
1e00: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1e10: 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70 29 3b  t(&db->tblDrop);
1e20: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e30: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e40: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1e50: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1e60: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1e80: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
1e90: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1ea0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 74  HashClear(&db->t
1eb0: 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72 28 70  blDrop);.  for(p
1ec0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1ed0: 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61 73  irst(&db->idxHas
1ee0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
1ef0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1f00: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1f10: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1f20: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1f30: 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  m);.    pIndex->
1f40: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1f50: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45 6c 65  }.  while( (pEle
1f60: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f70: 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29 29  t(&db->idxDrop))
1f80: 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  !=0 ){.    Index
1f90: 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74   *pIndex = sqlit
1fa0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  ;.    sqliteUnli
1fc0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1fd0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1fe0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
1ff0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
2000: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2010: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2020: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2030: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2040: 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20  uns when one or 
2050: 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42 4c  more CREATE TABL
2060: 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58 2c  E, CREATE INDEX,
2070: 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c 20  .** DROP TABLE, 
2080: 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  or DROP INDEX st
2090: 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72 6f  atements gets ro
20a0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65 0a  lled back.  The.
20b0: 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20  ** additions or 
20c0: 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61 62  deletions of Tab
20d0: 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72  le and Index str
20e0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a 2a  uctures in the.*
20f0: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
2100: 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f 6e  tables are undon
2110: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
2120: 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  o: sqliteCommitI
2130: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29  nternalChanges()
2140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
2150: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2160: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2170: 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65 6c  b){.  Hash toDel
2180: 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  ete;.  HashElem 
2190: 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28 64  *pElem;.  if( (d
21a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
21b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
21c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
21d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
21e0: 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54 45  toDelete, SQLITE
21f0: 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20 30  _HASH_POINTER, 0
2200: 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  );.  db->next_co
2210: 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d  okie = db->schem
2220: 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72 28  a_cookie;.  for(
2230: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2240: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
2250: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
2260: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2270: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
2280: 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71  ble *pTable = sq
2290: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
22a0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  em);.    if( !pT
22b0: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  able->isCommit )
22c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
22d0: 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65  shInsert(&toDele
22e0: 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20 70  te, pTable, 0, p
22f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
2300: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
2310: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2320: 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d 3b  oDelete); pElem;
2330: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2340: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2350: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2360: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2370: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
2380: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
2390: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
23a0: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
23b0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f 44  teHashClear(&toD
23c0: 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70 45  elete);.  for(pE
23d0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23e0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
23f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2400: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2410: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
2420: 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73 71  e *pOld, *p = sq
2430: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2440: 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
2450: 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   p->isCommit );.
2460: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2470: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2480: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
2490: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
24a0: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
24b0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
24c0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
24d0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
24e0: 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  ear(&db->tblDrop
24f0: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2500: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2510: 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  db->idxHash); pE
2520: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2530: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2540: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
2550: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61 73  ndex = sqliteHas
2560: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2570: 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 69    if( !pIndex->i
2580: 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  sCommit ){.     
2590: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
25a0: 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49 6e  t(&toDelete, pIn
25b0: 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29 3b  dex, 0, pIndex);
25c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
25d0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
25e0: 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65  hFirst(&toDelete
25f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2600: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2610: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
2620: 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  x *pIndex = sqli
2630: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  );.    sqliteUnl
2650: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2660: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
2670: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2680: 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b  lear(&toDelete);
2690: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
26a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
26b0: 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c 65  ->idxDrop); pEle
26c0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
26d0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
26e0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  .    Index *pOld
26f0: 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73  , *p = sqliteHas
2700: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2710: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 43    assert( p->isC
2720: 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d 3e  ommit );.    p->
2730: 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a 20  isDropped = 0;. 
2740: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
2750: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2760: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2770: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2780: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 61  me)+1, p);.    a
2790: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
27a0: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 7d  | pOld==p );.  }
27b0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
27c0: 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29  ar(&db->idxDrop)
27d0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
27e0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
27f0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2800: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e   Construct the n
2810: 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61  ame of a user ta
2820: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f  ble or index fro
2830: 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  m a token..**.**
2840: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2850: 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  he name is obtai
2860: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
2870: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
2880: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
2890: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
28a0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
28b0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
28c0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
28d0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
28e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
28f0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
2900: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
2910: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
2920: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
2940: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
2950: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
2960: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
2970: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
2980: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
2990: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
29a0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
29b0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
29c0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
29d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
29e0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
29f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a00: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
2a10: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
2a20: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
2a30: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
2a40: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
2a50: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
2a60: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
2a70: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
2a80: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
2a90: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
2aa0: 72 75 65 20 69 66 20 74 68 65 20 22 54 45 4d 50  rue if the "TEMP
2ab0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
2ac0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
2ad0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
2ae0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
2af0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
2b00: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
2b10: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
2b20: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
2b30: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
2b40: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
2b50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2b60: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
2b70: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
2b80: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
2b90: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
2ba0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2bb0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
2bc0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
2bd0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
2be0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
2bf0: 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  e sqliteEndTable
2c00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
2c10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
2c20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
2c30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
2c40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
2c50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72  .void sqliteStar
2c60: 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  tTable(Parse *pP
2c70: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74  arse, Token *pSt
2c80: 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  art, Token *pNam
2c90: 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  e, int isTemp){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
2cb0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2cc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2cd0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
2ce0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
2cf0: 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e   *v;..  pParse->
2d00: 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70  sFirstToken = *p
2d10: 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d  Start;.  zName =
2d20: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
2d30: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
2d40: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
2d50: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
2d60: 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   Before trying t
2d70: 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f  o create a tempo
2d80: 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65  rary table, make
2d90: 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20   sure the Btree 
2da0: 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67  for.  ** holding
2db0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2dc0: 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  s is open..  */.
2dd0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
2de0: 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29  db->pBeTemp==0 )
2df0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2e00: 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30  qliteBtreeOpen(0
2e10: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
2e20: 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20  &db->pBeTemp);. 
2e30: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2e50: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2e60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2e70: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
2e80: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
2e90: 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
2ea0: 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
2eb0: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
2ec0: 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  es", 0);.      p
2ed0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2ef0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
2f00: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f10: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
2f20: 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42  c = sqliteBtreeB
2f30: 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42  eginTrans(db->pB
2f40: 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  eTemp);.      if
2f50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f70: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2f80: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
2f90: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
2fa0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
2fb0: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
2fc0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
2fd0: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
2fe0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2ff0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3000: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3010: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3020: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3030: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3040: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3050: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3060: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3070: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3080: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3090: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
30a0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
30b0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
30c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
30d0: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
30e0: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
30f0: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3100: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3110: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3120: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3130: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3140: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3150: 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e 65  en ignore the ne
3160: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
3170: 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  e..  ** We will 
3180: 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67  continue parsing
3190: 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73 65  , but the pParse
31a0: 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61 67  ->nameClash flag
31b0: 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a   will be set.  *
31c0: 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  * so we will kno
31d0: 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68 65  w to discard the
31e0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e   table record on
31f0: 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20 66  ce parsing has f
3200: 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  inished..  */.  
3210: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
3220: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
3230: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
3240: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e!=0 ){.    if( 
3250: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26  pTable->isTemp &
3260: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
3270: 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ag ){.      pPar
3280: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3290: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
32a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
32b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
32c0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
32d0: 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e   0, pName->z, pN
32e0: 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20  ame->n,.        
32f0: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
3300: 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ts", 0, 0);.    
3310: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3320: 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
3330: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3340: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
3360: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3370: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  0;.  }.  if( (pI
3380: 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  dx = sqliteFindI
3390: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29  ndex(db, zName))
33a0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
33b0: 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   (!pIdx->pTable-
33c0: 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72  >isTemp || !pPar
33d0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
33e0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
33f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3400: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
3410: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3420: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
3430: 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20     zName, 0);.  
3440: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3450: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
3460: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
3470: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3480: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3490: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
34a0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
34b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
34c0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
34d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
34e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
34f0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
3500: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3510: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3520: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3530: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3540: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3550: 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73 54  le->isTemp = isT
3560: 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73  emp;.  if( pPars
3570: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
3580: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
3590: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
35a0: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
35b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
35c0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
35d0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
35e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
35f0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
3600: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
3610: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
3620: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
3630: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
3640: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
3650: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
3660: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
3670: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
3680: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
3690: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
36a0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
36b0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
36c0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
36d0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
36e0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
36f0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
3700: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
3710: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
3720: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
3730: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
3740: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
3750: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3760: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
3770: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
3780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
3790: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
37a0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74  & (v = sqliteGet
37b0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
37c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65   ){.    sqliteBe
37d0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
37e0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  n(pParse);.    i
37f0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3800: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3810: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
3820: 6b 69 65 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  kie, db->file_fo
3830: 72 6d 61 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rmat, 1);.      
3840: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3850: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
3860: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
3870: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
3880: 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e  (v, -1, MASTER_N
3890: 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  AME, P3_STATIC);
38a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
38b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
38c0: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
38d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
38e0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
38f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3900: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3910: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3930: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3940: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
3950: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3960: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
3970: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
3980: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3990: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
39a0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
39b0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
39c0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
39d0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
39e0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
39f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3a00: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3a10: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3a20: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3a30: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3a40: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
3a50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
3a60: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
3a70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
3a80: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
3a90: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3aa0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3ab0: 70 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  p;.  char **pz;.
3ac0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3ad0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3ae0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3af0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
3b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
3b10: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
3b20: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
3b30: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
3b40: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
3b50: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
3b60: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
3b70: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
3b80: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
3b90: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 6f 6c   memset(&p->aCol
3ba0: 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69  [p->nCol], 0, si
3bb0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
3bc0: 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  );.  pz = &p->aC
3bd0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e  ol[p->nCol++].zN
3be0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  ame;.  sqliteSet
3bf0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e 61 6d  NString(pz, pNam
3c00: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3c10: 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  0);.  sqliteDequ
3c20: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
3c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3c40: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
3c50: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
3c60: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
3c70: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
3c80: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3c90: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
3ca0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
3cb0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
3cc0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
3cd0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
3ce0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
3cf0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
3d00: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
3d10: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
3d20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e  .void sqliteAddN
3d30: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
3d40: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
3d50: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
3d60: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
3d70: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
3d80: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
3d90: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
3da0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
3db0: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
3dc0: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
3dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3de0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3df0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
3e00: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
3e10: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
3e20: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
3e30: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
3e40: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
3e50: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
3e60: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
3e70: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
3e80: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
3e90: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
3ea0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
3eb0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3ec0: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
3ed0: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
3ee0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
3ef0: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
3f00: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
3f10: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
3f20: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3f30: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
3f40: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
3f50: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
3f60: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
3f70: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
3f80: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
3f90: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46  Parse, Token *pF
3fa0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61  irst, Token *pLa
3fb0: 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  st){.  Table *p;
3fc0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
3fd0: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c  nt n;.  char *z,
3fe0: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
3ff0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4000: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4010: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4020: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4030: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4040: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b  ->aCol[i].zType;
4050: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
4060: 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29  + Addr(pLast->z)
4070: 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e   - Addr(pFirst->
4080: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e  z);.  sqliteSetN
4090: 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73  String(pz, pFirs
40a0: 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a  t->z, n, 0);.  z
40b0: 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d   = *pz;.  if( z=
40c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
40d0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
40e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
40f0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
4100: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
4110: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
4120: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
4130: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
4140: 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20  The given token 
4150: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
4160: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73  alue for the las
4170: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
4180: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63  o.** the table c
4190: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
41a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  onstruction.  If
41b0: 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20   "minusFlag" is 
41c0: 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  true, it.** mean
41d0: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65  s the value toke
41e0: 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  n was preceded b
41f0: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
4200: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4210: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4220: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4230: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4240: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4250: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4260: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
4270: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
4280: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
4290: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
42a0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
42b0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
42c0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70  nt i;.  char **p
42d0: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
42e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
42f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4300: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4310: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
4320: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
4330: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69  ol[i].zDflt;.  i
4340: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
4350: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4360: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
4370: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
4380: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
4390: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
43a0: 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a  ring(pz, pVal->z
43b0: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
43c0: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f   }.  sqliteDequo
43d0: 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  te(*pz);.}../*.*
43e0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
43f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
4400: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
4410: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
4420: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
4430: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
4440: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
4450: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
4460: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
4470: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
4480: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
4490: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
44a0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
44b0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
44c0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
44d0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
44e0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
44f0: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
4500: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
4510: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
4520: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
4530: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
4540: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
4550: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
4560: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
4570: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
4580: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
4590: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
45a0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
45b0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69  umn as the row i
45c0: 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a  d.  (Exception:.
45d0: 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  ** For backwards
45e0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
45f0: 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61  ith older databa
4600: 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  ses, do not do t
4610: 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  his.** if the fi
4620: 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  le format versio
4630: 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  n number is less
4640: 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74   than 1.)  Set t
4650: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
4660: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
4670: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4680: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
4690: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
46a0: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
46b0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
46c0: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
46d0: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
46e0: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
46f0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
4700: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
4710: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
4720: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
4730: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
4740: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
4750: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
4760: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
4770: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
4780: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
4790: 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72   sqliteAddPrimar
47a0: 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  yKey(Parse *pPar
47b0: 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  se, IdList *pLis
47c0: 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  t, int onError){
47d0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
47e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
47f0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
4800: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
4810: 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  l = -1;.  if( pT
4820: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
4830: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
4840: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
4850: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4860: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4870: 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62  "table \"", pTab
4880: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
4890: 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74    "\" has more t
48a0: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
48b0: 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  key", 0);.    pP
48c0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
48d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
48e0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
48f0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
4900: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
4910: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
4920: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
4930: 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a  List->nId==1 ){.
4940: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
4950: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
4960: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
4970: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
4980: 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e  p(pList->a[0].zN
4990: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
49a0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
49b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
49c0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
49d0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
49e0: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
49f0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
4a00: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
4a10: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4a20: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20  >file_format>=1 
4a30: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  && .           z
4a40: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74  Type && sqliteSt
4a50: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
4a60: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
4a70: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
4a80: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
4a90: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
4aa0: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
4ab0: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
4ac0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
4ad0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
4ae0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
4af0: 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68  .** Come up with
4b00: 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61   a new random va
4b10: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63 68 65  lue for the sche
4b20: 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65  ma cookie.  Make
4b30: 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77   sure.** the new
4b40: 20 76 61 6c 75 65 20 69 73 20 64 69 66 66 65 72   value is differ
4b50: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64  ent from the old
4b60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
4b70: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
4b80: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
4b90: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
4ba0: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
4bb0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
4bc0: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
4bd0: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
4be0: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
4bf0: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
4c00: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
4c10: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
4c20: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
4c30: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
4c40: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
4c50: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
4c60: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
4c70: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
4c80: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
4c90: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
4ca0: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
4cb0: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
4cc0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
4cd0: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
4ce0: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
4cf0: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
4d00: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
4d10: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
4d20: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
4d30: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
4d40: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
4d50: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
4d60: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
4d70: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
4d80: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
4d90: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
4da0: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
4db0: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
4dc0: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
4dd0: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
4de0: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
4df0: 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
4e00: 6f 69 64 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65  oid changeCookie
4e10: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
4e20: 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  if( db->next_coo
4e30: 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61 5f  kie==db->schema_
4e40: 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64 62  cookie ){.    db
4e50: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20  ->next_cookie = 
4e60: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
4e70: 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  e + sqliteRandom
4e80: 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20  Byte() + 1;.    
4e90: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4ea0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4eb0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
4ec0: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
4ed0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
4ee0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
4ef0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
4f00: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
4f10: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
4f20: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
4f30: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
4f40: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
4f50: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
4f60: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
4f70: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
4f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
4f90: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
4fa0: 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20  eedQuote = 0;.  
4fb0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
4fc0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
4fd0: 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b  *z=='\'' ){ n++;
4fe0: 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a   needQuote=1; }.
4ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
5000: 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a   needQuote*2;.}.
5010: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5020: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
5030: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
5040: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
5050: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
5060: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
5070: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5080: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
5090: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
50a0: 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e  r *zIdent){.  in
50b0: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
50c0: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
50d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
50e0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
50f0: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
5100: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
5110: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
5120: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
5130: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
5140: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
5150: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
5160: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
5170: 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65 28  liteKeywordCode(
5180: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
5190: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
51a0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  te ) z[i++] = '\
51b0: 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  '';.  for(j=0; z
51c0: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
51d0: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
51e0: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
51f0: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20  zIdent[j]=='\'' 
5200: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
5210: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
5220: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
5230: 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30  '\'';.  z[i] = 0
5240: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5260: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5270: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
5280: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
5290: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
52a0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
52b0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
52c0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
52d0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
52e0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
52f0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
5300: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
5310: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5320: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
5330: 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b  eStmt(Table *p){
5340: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
5350: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
5360: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
5370: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20  ep2, *zEnd;.  n 
5380: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
5390: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
53a0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
53b0: 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d  ength(p->aCol[i]
53c0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  .zName);.  }.  n
53d0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
53e0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
53f0: 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<40 ){.    zSe
5400: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
5410: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
5420: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
5430: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
5440: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
5450: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
5460: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
5470: 20 20 6e 20 2b 3d 20 32 35 20 2b 20 36 2a 70 2d    n += 25 + 6*p-
5480: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
5490: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
54a0: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
54b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
54c0: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 54   assert( !p->isT
54d0: 65 6d 70 20 29 3b 0a 20 20 73 74 72 63 70 79 28  emp );.  strcpy(
54e0: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
54f0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
5500: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
5510: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
5520: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
5530: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
5540: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ';.  for(i=0; i<
5550: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
5560: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
5570: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
5580: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
5590: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
55a0: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
55b0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
55c0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
55d0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  me);.  }.  strcp
55e0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
55f0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
5600: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
5610: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5620: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
5630: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
5640: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
5650: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5660: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
5670: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
5680: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
5690: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
56a0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
56b0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
56c0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
56d0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
56e0: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
56f0: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
5700: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
5710: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
5720: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
5730: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
5740: 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20  .** unless this 
5750: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
5760: 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67  able or initFlag
5770: 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46  ==1.  When initF
5780: 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65  lag==1,.** it me
5790: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
57a0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
57b0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
57c0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
57d0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
57e0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
57f0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
5800: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
5810: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
5820: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
5830: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
5840: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
5850: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
5860: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
5870: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
5880: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
5890: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
58a0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
58b0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
58c0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
58d0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
58e0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
58f0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
5900: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
5910: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
5920: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
5930: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
5940: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
5950: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
5960: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
5970: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
5980: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
5990: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
59a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
59b0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
59c0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
59d0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
59e0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
59f0: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
5a00: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
5a10: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
5a20: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
5a30: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
5a40: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
5a50: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
5a60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5a70: 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  n;..  /* Add the
5a80: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
5a90: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
5aa0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
5ab0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
5ac0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
5ad0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20 70  ameClash==0 || p
5ae0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d  Parse->initFlag=
5af0: 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =1 );.  if( pPar
5b00: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26  se->explain==0 &
5b10: 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  & pParse->nameCl
5b20: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  ash==0 ){.    Ta
5b30: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  ble *pOld;.    p
5b40: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
5b50: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
5b60: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
5b70: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
5b80: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
5b90: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
5ba0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
5bb0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
5bc0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
5bd0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
5be0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
5bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
5c00: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
5c10: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
5c20: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
5c30: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5c40: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
5c50: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
5c60: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
5c70: 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68  rom a SELECT, th
5c80: 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  en construct the
5c90: 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f  .  ** list of co
5ca0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65  lumns and the te
5cb0: 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  xt of the table.
5cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  .  */.  if( pSel
5cd0: 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ect ){.    Table
5ce0: 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69   *pSelTab = sqli
5cf0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
5d00: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
5d10: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
5d20: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
5d30: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
5d40: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
5d50: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
5d60: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
5d70: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
5d80: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
5d90: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
5da0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
5db0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
5dc0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
5dd0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a   pSelTab);.  }..
5de0: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
5df0: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
5e00: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
5e10: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
5e20: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
5e30: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
5e40: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
5e50: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
5e60: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
5e70: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
5e80: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
5e90: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
5ea0: 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70 50  rom the .  ** pP
5eb0: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
5ec0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
5ed0: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68 61  number should ha
5ee0: 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a 2a  ve been put.  **
5ef0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
5f00: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
5f10: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
5f20: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
5f30: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
5f40: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
5f50: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
5f60: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
5f70: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
5f80: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
5f90: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
5fa0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5fb0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
5fc0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
5fd0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
5fe0: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
5ff0: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
6000: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
6010: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
6020: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
6030: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
6040: 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65 61  , then just crea
6050: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20 44  te the table.  D
6060: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65 20  o not.  ** make 
6070: 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c 49  an entry in SQLI
6080: 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a  TE_MASTER..  */.
6090: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
60a0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
60b0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
60c0: 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  v;..    v = sqli
60d0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
60e0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
60f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6100: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
6110: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
6120: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
6130: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6140: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
6150: 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 73  eTable, 0, p->is
6160: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
6170: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6180: 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26  v, -1, (char *)&
6190: 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e  p->tnum, P3_POIN
61a0: 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TER);.    }else{
61b0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
61c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
61d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
61e0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
61f0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
6200: 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  m = 0;.    if( !
6210: 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  p->isTemp ){.   
6220: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6230: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
6240: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6250: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6260: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6270: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
6280: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
6290: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
62a0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 74  angeP3(v, -1, "t
62b0: 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49 43  able", P3_STATIC
62c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
62d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
62e0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
62f0: 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54 41  , "view", P3_STA
6300: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
6310: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6320: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
6330: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
6340: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
6350: 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d  3(v, -1, p->zNam
6360: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
6370: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6380: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6390: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
63a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
63b0: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
63c0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
63d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
63e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
63f0: 20 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   4, 0);.      sq
6400: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6410: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
6420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
6430: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
6440: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
6450: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
6460: 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74        n = z ? st
6470: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20  rlen(z) : 0;.   
6480: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6490: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
64a0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , n);.        sq
64b0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
64c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64d0: 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d    assert( pEnd!=
64e0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  0 );.        n =
64f0: 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
6500: 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46   Addr(pParse->sF
6510: 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  irstToken.z) + 1
6520: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6530: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
6540: 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72  -1, pParse->sFir
6550: 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  stToken.z, n);. 
6560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6570: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6580: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
6590: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
65a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
65b0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
65c0: 30 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  0);.      change
65d0: 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20  Cookie(db);.    
65e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
65f0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6600: 65 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  e, db->next_cook
6610: 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ie, 0);.      sq
6620: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6630: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
6640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6650: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6660: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54   int op = p->isT
6670: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41  emp ? OP_OpenWrA
6680: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ux : OP_OpenWrit
6690: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
66a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
66b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
66c0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
66d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
66e0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
66f0: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
6700: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
6710: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
6720: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
6730: 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rse);.  }.}../*.
6740: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
6750: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
6760: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
6770: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
6780: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
6790: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
67a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
67b0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
67c0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
67d0: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
67e0: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
67f0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
6800: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6810: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
6820: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
6830: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
6840: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
6850: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
6860: 6c 65 63 74 20 20 20 20 2f 2a 20 41 20 53 45 4c  lect    /* A SEL
6870: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
6880: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
6890: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 29  he new view */.)
68a0: 7b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  {.  Token sEnd;.
68b0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 6f    Table *p;.  co
68c0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
68d0: 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b 0a 0a 20  nt n, offset;.. 
68e0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
68f0: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
6900: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 70  , pName, 0);.  p
6910: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6920: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
6930: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
6940: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
6950: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
6960: 0a 20 20 7d 0a 20 20 70 2d 3e 70 53 65 6c 65 63  .  }.  p->pSelec
6970: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 69  t = pSelect;.  i
6980: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
6990: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
69a0: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
69b0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
69c0: 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   p) ){.      ret
69d0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
69e0: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
69f0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
6a00: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
6a10: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
6a20: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
6a30: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
6a40: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
6a50: 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20  = ((int)sEnd.z) 
6a60: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
6a70: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
6a80: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
6a90: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
6aa0: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
6ab0: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
6ac0: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
6ad0: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
6ae0: 20 20 7a 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74    z = p->pSelect
6af0: 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->zSelect = sqli
6b00: 74 65 53 74 72 4e 44 75 70 28 7a 2c 20 6e 29 3b  teStrNDup(z, n);
6b10: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
6b20: 6f 66 66 73 65 74 20 3d 20 28 28 69 6e 74 29 7a  offset = ((int)z
6b30: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
6b40: 3e 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  >z;.    sqliteSe
6b50: 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28  lectMoveStrings(
6b60: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 6f 66 66 73  p->pSelect, offs
6b70: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  et);.    sqliteE
6b80: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
6b90: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 7d 0a 20  &sEnd, 0);.  }. 
6ba0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
6bb0: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
6bc0: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
6bd0: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
6be0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
6bf0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
6c00: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
6c10: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
6c20: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
6c30: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
6c40: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
6c50: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
6c60: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
6c70: 73 73 61 67 65 20 69 6e 20 70 50 61 72 65 2d 3e  ssage in pPare->
6c80: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
6c90: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
6ca0: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
6cb0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
6cc0: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
6cd0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
6ce0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
6cf0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
6d00: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
6d10: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
6d20: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
6d30: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
6d40: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
6d50: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
6d60: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
6d70: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
6d80: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
6d90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6da0: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
6db0: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
6dc0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
6dd0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
6de0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
6df0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
6e00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
6e10: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
6e20: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
6e30: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
6e40: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
6e50: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
6e60: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
6e70: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
6e80: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
6e90: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
6ea0: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
6eb0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
6ec0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
6ed0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2f 0a 20 20  ROM one;.  */.  
6ee0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
6ef0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
6f00: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
6f10: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65  e->zErrMsg, "vie
6f20: 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  w ", pTable->zNa
6f30: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 22 20 69  me,.         " i
6f40: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
6f50: 69 6e 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  ined", 0);.    p
6f60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
6f80: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
6f90: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
6fa0: 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
6fb0: 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
6fc0: 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61   names..  */.  a
6fd0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
6fe0: 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20  Select ); /* If 
6ff0: 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54  nCol==0, then pT
7000: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56  able must be a V
7010: 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20  IEW */.  pSel = 
7020: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b  pTable->pSelect;
7030: 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  ..  /* Note that
7040: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
7050: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
7060: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
7070: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
7080: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  elements in this
7090: 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65 20 77   list.  But we w
70a0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74  ill need to rest
70b0: 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a  ore the list.  *
70c0: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  * back to its or
70d0: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
70e0: 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c  tion afterwards,
70f0: 20 73 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f   so we save a co
7100: 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f  py of.  ** the o
7110: 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73  riginal in pELis
7120: 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74  t..  */.  pEList
7130: 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b   = pSel->pEList;
7140: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
7150: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
7160: 44 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69  Dup(pEList);.  i
7170: 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d  f( pSel->pEList=
7180: 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e  =0 ){.    pSel->
7190: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
71a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20  .    return 1;  
71b0: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
71c0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65   */.  }.  pTable
71d0: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70  ->nCol = -1;.  p
71e0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52  SelTab = sqliteR
71f0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
7200: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
7210: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  );.  if( pSelTab
7220: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7230: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
7240: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
7250: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
7260: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
7270: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
7280: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
7290: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
72a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
72b0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  = 0;.    sqliteD
72c0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
72d0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 70 50 61 72  elTab);.    pPar
72e0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  se->db->flags |=
72f0: 20 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56   SQLITE_UnresetV
7300: 69 65 77 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iews;.  }else{. 
7310: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
7320: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
7330: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c  .  }.  sqliteSel
7340: 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b  ectUnbind(pSel);
7350: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  .  sqliteExprLis
7360: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
7370: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
7380: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
7390: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
73a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
73b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
73c0: 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70   from the VIEW p
73d0: 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Table..**.** Thi
73e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
73f0: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79  led whenever any
7400: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20   other table or 
7410: 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64  view is modified
7420: 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61  ..** The view pa
7430: 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
7440: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70  outine might dep
7450: 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20  end directly or 
7460: 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e  indirectly.** on
7470: 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72   the modified or
7480: 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73   deleted table s
7490: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  o we need to cle
74a0: 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d  ar the old colum
74b0: 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68  n.** names so th
74c0: 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
74d0: 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  recomputed..*/.s
74e0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
74f0: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
7500: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
7510: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
7520: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c   if( pTable==0 |
7530: 7c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  | pTable->pSelec
7540: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
7550: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
7560: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
7570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
7580: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
7590: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
75a0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
75b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
75c0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
75d0: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20  ol[i].zDflt);.  
75e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
75f0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  ble->aCol[i].zTy
7600: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
7610: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
7620: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
7630: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
7640: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
7650: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
7660: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
7670: 6d 20 65 76 65 72 79 20 56 49 45 57 2e 0a 2a 2f  m every VIEW..*/
7680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77  .void sqliteView
7690: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20  ResetAll(sqlite 
76a0: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
76b0: 20 2a 69 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e   *i;.  if( (db->
76c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 55  flags & SQLITE_U
76d0: 6e 72 65 73 65 74 56 69 65 77 73 29 3d 3d 30 20  nresetViews)==0 
76e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
76f0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
7700: 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b  t(&db->tblHash);
7710: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
7720: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
7730: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
7740: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
7750: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
7760: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
7770: 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c  liteViewResetCol
7780: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
7790: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
77a0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
77b0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 7d  _UnresetViews;.}
77c0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
77d0: 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61  token, look up a
77e0: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74   table with that
77f0: 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66   name.  If not f
7800: 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61  ound, leave.** a
7810: 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20  n error for the 
7820: 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61  parser to find a
7830: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
7840: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
7850: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
7860: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
7870: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
7880: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
7890: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
78a0: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
78b0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
78c0: 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  k);.  if( zName=
78d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
78e0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
78f0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
7900: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
7910: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
7920: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
7930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
7940: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7950: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
7960: 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a  h table: ", 0, .
7970: 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c          pTok->z,
7980: 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pTok->n, 0);.  
7990: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
79a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
79b0: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
79c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
79d0: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
79e0: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
79f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
7a00: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
7a10: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
7a20: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
7a30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72  */.void sqliteDr
7a40: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
7a50: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
7a60: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
7a70: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
7a80: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
7a90: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
7aa0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
7ab0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
7ac0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
7ad0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
7ae0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61   ) return;.  pTa
7af0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ble = sqliteTabl
7b00: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
7b10: 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  e, pName);.  if(
7b20: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
7b30: 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  urn;.  if( pTabl
7b40: 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  e->readOnly ){. 
7b50: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7b60: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7b70: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
7b80: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20  Table->zName, . 
7b90: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
7ba0: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
7bb0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7bc0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
7bd0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65  .  }.  if( isVie
7be0: 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65  w && pTable->pSe
7bf0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
7c00: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
7c10: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
7c20: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
7c30: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
7c40: 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65   ",.      pTable
7c50: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
7c60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7c70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7c80: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
7c90: 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  & pTable->pSelec
7ca0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  t ){.    sqliteS
7cb0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
7cc0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20  ->zErrMsg, "use 
7cd0: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
7ce0: 65 74 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20  ete view ",.    
7cf0: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c    pTable->zName,
7d00: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7d10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
7d20: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  urn;.  }..  /* G
7d30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
7d40: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
7d50: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
7d60: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
7d70: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
7d80: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
7d90: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
7da0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
7db0: 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20  eOp dropTable[] 
7dc0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  = {.      { OP_O
7dd0: 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32 2c  penWrite,  0, 2,
7de0: 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e          MASTER_N
7df0: 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  AME},.      { OP
7e00: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
7e10: 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(9),  0},.  
7e20: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
7e30: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7e40: 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20    0}, /* 2 */.  
7e50: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
7e60: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
7e70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7e80: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
7e90: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7ea0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   4 */.      { OP
7eb0: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
7ec0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
7ed0: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
7ee0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
7ef0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7f00: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
7f10: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
7f20: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
7f30: 20 20 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c       0, ADDR(4),
7f40: 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
7f50: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
7f60: 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ie,  0, 0,      
7f70: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
7f80: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
7f90: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7fa0: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
7fb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
7fc0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
7fd0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
7fe0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
7ff0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  able->isTemp ){.
8000: 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c        base = sql
8010: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
8020: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
8030: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
8040: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
8050: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
8060: 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c 65  , base+2, pTable
8070: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
8080: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
8090: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
80a0: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
80b0: 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78   base+9, db->nex
80c0: 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  t_cookie);.    }
80d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
80e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
80f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8100: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
8110: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
8120: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  sTemp);.      fo
8130: 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70  r(pIdx=pTable->p
8140: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
8150: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
8160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8170: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
8180: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
8190: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
81a0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
81b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  }.    sqliteEndW
81c0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
81d0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
81e0: 20 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20   Move the table 
81f0: 28 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64  (and all its ind
8200: 69 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e  ices) to the pen
8210: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e  ding DROP queue.
8220: 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
8230: 20 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72   table was never
8240: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74   committed, just
8250: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20   delete it.  If 
8260: 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
8270: 61 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  as been committe
8280: 64 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20  d and is placed 
8290: 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  on the pending D
82a0: 52 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20  ROP queue, then 
82b0: 74 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  the.  ** delete 
82c0: 77 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20  will occur when 
82d0: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
82e0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78  rnalChanges() ex
82f0: 65 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ecutes..  **.  *
8300: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
8310: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
8320: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
8330: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
8340: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
8350: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
8360: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
8370: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
8380: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
8390: 50 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65  PendingDropTable
83a0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
83b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
83c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
83d0: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
83e0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
83f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
8400: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
8410: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
8420: 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20    pIndex is the 
8430: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
8440: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65  x .** and pTable
8450: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8460: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
8470: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
8480: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
8490: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
84a0: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
84b0: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
84c0: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
84d0: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
84e0: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
84f0: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
8500: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
8510: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
8520: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
8530: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
8540: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8550: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
8560: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
8570: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8580: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
8590: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
85a0: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
85b0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
85c0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
85d0: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
85e0: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
85f0: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
8600: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
8610: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
8620: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
8630: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
8640: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8650: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8660: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
8670: 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a  iteCreateIndex(.
8680: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8690: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
86a0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
86b0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
86c0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
86d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
86e0: 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  x.  May be NULL 
86f0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
8700: 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  le,   /* Name of
8710: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e   the table to in
8720: 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65  dex.  Use pParse
8730: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
8740: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c   */.  IdList *pL
8750: 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
8760: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
8770: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
8780: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
8790: 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
87a0: 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
87b0: 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
87c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
87d0: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
87e0: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
87f0: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
8800: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
8810: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
8820: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
8830: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
8840: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
8850: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
8860: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
8870: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
8880: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
8890: 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54   *pIndex;   /* T
88a0: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
88b0: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
88c0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
88d0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
88e0: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
88f0: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
8900: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
8910: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c  ID list */.  sql
8920: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
8930: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65  ->db;.  int hide
8940: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
8950: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20    /* Do not put 
8960: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
8970: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
8980: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8990: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
89a0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
89b0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
89c0: 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
89d0: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
89e0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
89f0: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
8a00: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
8a10: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
8a20: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61  able!=0 ){.    a
8a30: 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20  ssert( pName!=0 
8a40: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73  );.    pTab =  s
8a50: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
8a60: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ken(pParse, pTab
8a70: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
8a80: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
8a90: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
8aa0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
8ab0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
8ac0: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
8ad0: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
8ae0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
8af0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
8b00: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
8b10: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
8b20: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8b30: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
8b40: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
8b50: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20  ay not have new 
8b60: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
8b70: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
8b80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
8b90: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
8ba0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
8bb0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
8bc0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8bd0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8be0: 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20  Msg, "views may 
8bf0: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
8c00: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
8c10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
8c20: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
8c30: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
8c40: 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
8c50: 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65  created while re
8c60: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68  -reading the sch
8c70: 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ema from sqlite_
8c80: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20  master.  ** but 
8c90: 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  the table associ
8ca0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8cb0: 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72  ndex is a tempor
8cc0: 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61  ary table, it ca
8cd0: 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e  n.  ** only mean
8ce0: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
8cf0: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8d00: 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69  is really associ
8d10: 61 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a  ated with is.  *
8d20: 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65  * one whose name
8d30: 20 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e   is hidden behin
8d40: 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  d a temporary ta
8d50: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
8d60: 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e  e name..  ** Sin
8d70: 63 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73  ce its table has
8d80: 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64   been suppressed
8d90: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73  , we need to als
8da0: 6f 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20  o suppress the. 
8db0: 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   ** index..  */.
8dc0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
8dd0: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d 3e  itFlag && pTab->
8de0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f  isTemp ){.    go
8df0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
8e00: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
8e10: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
8e20: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
8e30: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
8e40: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
8e50: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
8e60: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
8e70: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
8e80: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
8e90: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
8ea0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
8eb0: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
8ec0: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
8ed0: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
8ee0: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
8ef0: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
8f00: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
8f10: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
8f20: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
8f30: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
8f40: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
8f50: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
8f60: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
8f70: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
8f80: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
8f90: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
8fa0: 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20  ex, but we will 
8fb0: 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69  not.  ** store i
8fc0: 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68  ts name in the h
8fd0: 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20  ash table.  Set 
8fe0: 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61  the hideName fla
8ff0: 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a  g to accomplish.
9000: 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a    ** this..  **.
9010: 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
9020: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
9030: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
9040: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
9050: 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
9060: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
9070: 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
9080: 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
9090: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
90a0: 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  me ){.    Index 
90b0: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
90c0: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
90d0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
90e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
90f0: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
9100: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
9110: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
9120: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
9130: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
9140: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
9150: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
9160: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
9170: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9180: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
9190: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
91a0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
91b0: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
91c0: 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d   if( pISameName-
91d0: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
91e0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
91f0: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
9200: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
9210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9220: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
9230: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
9240: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
9250: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
9260: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
9270: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  s", 0);.        
9280: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9290: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
92a0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
92b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92c0: 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d    if( (pTSameNam
92d0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
92e0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  ble(db, zName))!
92f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9300: 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65  pTSameName->isTe
9310: 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  mp && pParse->in
9320: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  itFlag ){.      
9330: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a    hideName = 1;.
9340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9350: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
9360: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9370: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
9380: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
9390: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
93a0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
93b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
93c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
93d0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
93e0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
93f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9400: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
9410: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
9420: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
9430: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
9440: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
9450: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
9460: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
9470: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
9480: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
9490: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
94a0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
94b0: 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61  &zName, "(", pTa
94c0: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f  b->zName, " auto
94d0: 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30  index ", zBuf, 0
94e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
94f0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9500: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9510: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c    hideName = sql
9520: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
9530: 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a   zName)!=0;.  }.
9540: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
9550: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
9560: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
9570: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
9580: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
9590: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
95a0: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
95b0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
95c0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
95d0: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
95e0: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
95f0: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
9600: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
9610: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
9620: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
9630: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
9640: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
9650: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
9660: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
9670: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
9680: 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
9690: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
96a0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
96b0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
96c0: 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
96d0: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
96e0: 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
96f0: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
9700: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
9710: 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
9720: 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69   sizeof(int)*pLi
9750: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
9760: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
9770: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9780: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
9790: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
97a0: 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49  &pIndex[1];.  pI
97b0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
97c0: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
97d0: 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49  Column[pList->nI
97e0: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
97f0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
9800: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
9810: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
9820: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
9830: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70   pList->nId;.  p
9840: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
9850: 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75   pIndex->isUniqu
9860: 65 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20  e = onError;..  
9870: 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
9880: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
9890: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
98a0: 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
98b0: 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
98c0: 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
98d0: 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
98e0: 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
98f0: 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
9900: 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
9910: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
9920: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
9930: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
9940: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
9950: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
9960: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
9970: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9980: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9990: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
99a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
99b0: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
99c0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
99d0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
99e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
99f0: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
9a00: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
9a10: 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e   " has no column
9a20: 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d   named ", pList-
9a30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
9a40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9a50: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
9a60: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
9a70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
9a80: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
9a90: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
9aa0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
9ab0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
9ac0: 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
9ad0: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
9ae0: 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
9af0: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
9b00: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
9b10: 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
9b20: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
9b30: 65 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65  explain && !hide
9b40: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65  Name ){.    Inde
9b50: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
9b60: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
9b70: 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e  db->idxHash, pIn
9b80: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
9b90: 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  en(zName)+1, pIn
9ba0: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
9bb0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9bc0: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
9bd0: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
9be0: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
9bf0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
9c00: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
9c10: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9c20: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
9c30: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
9c40: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
9c50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
9c60: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
9c70: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
9c80: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
9c90: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
9ca0: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
9cb0: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
9cc0: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
9cd0: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
9ce0: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
9cf0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
9d00: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
9d10: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
9d20: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
9d30: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
9d40: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
9d50: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
9d60: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
9d70: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
9d80: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
9d90: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
9da0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
9db0: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
9dc0: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
9dd0: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
9de0: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
9df0: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
9e00: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
9e10: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
9e20: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
9e30: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
9e40: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
9e50: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
9e60: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
9e70: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
9e80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
9e90: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
9ea0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
9eb0: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
9ec0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
9ed0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9ee0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
9ef0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
9f00: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
9f10: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
9f20: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
9f30: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
9f40: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
9f50: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
9f60: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
9f70: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
9f80: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
9f90: 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20  ag && pTable!=0 
9fa0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
9fb0: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
9fc0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
9fd0: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
9fe0: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
9ff0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
a000: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
a010: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
a020: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
a030: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a040: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
a050: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
a060: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
a070: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
a080: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e    **.  ** The in
a090: 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e  itFlag is 0 when
a0a0: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
a0b0: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
a0c0: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
a0d0: 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c  and.  The initFl
a0e0: 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  ag is 1 when a d
a0f0: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
a100: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
a110: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
a120: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
a130: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
a140: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
a150: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
a160: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
a170: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
a180: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
a190: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
a1a0: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
a1b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
a1c0: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
a1d0: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
a1e0: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
a1f0: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
a200: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
a210: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
a220: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a230: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
a240: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
a250: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
a260: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
a270: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
a280: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
a290: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
a2a0: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
a2b0: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
a2c0: 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a  >initFlag==0 ){.
a2d0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
a2e0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
a2f0: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
a300: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
a310: 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 54  ddr;.    int isT
a320: 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  emp = pTab->isTe
a330: 6d 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  mp;..    v = sql
a340: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
a350: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
a360: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
a370: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
a380: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
a390: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
a3a0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
a3b0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
a3c0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
a3d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a3e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
a3f0: 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20  Write, 0, 2);.  
a400: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a410: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
a420: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f  MASTER_NAME, P3_
a430: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
a450: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
a460: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a470: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
a480: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a490: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a4a0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
a4b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a4c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a4d0: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
a4e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
a4f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a500: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
a510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a520: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a530: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
a540: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a550: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a560: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
a570: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a580: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a590: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
a5a0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
a5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
a5c0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
a5d0: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
a5e0: 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  dex, 0, isTemp);
a5f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
a600: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
a610: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
a620: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
a630: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
a640: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
a650: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
a660: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
a670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a680: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a690: 65 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a  enWrAux, 1, 0);.
a6a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a6b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a6c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a6d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
a6e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a6f0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
a700: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
a710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
a720: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64  Temp ){.      ad
a730: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
a740: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a750: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
a760: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
a770: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  nd ){.        n 
a780: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
a790: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
a7a0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73  ) + 1;.        s
a7b0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
a7c0: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
a7d0: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t->z, n);.      
a7e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
a7f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
a800: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
a810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
a820: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
a830: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
a840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
a850: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
a860: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a870: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
a880: 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32  Aux : OP_Open, 2
a890: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
a8a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a8b0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
a8c0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
a8d0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62  TATIC);.      lb
a8e0: 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l2 = sqliteVdbeM
a8f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a900: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a910: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
a920: 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
a930: 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
a940: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
a950: 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cno, 2, 0);.    
a960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
a970: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
a980: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
a990: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a9a0: 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e  P_Column, 2, pIn
a9b0: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
a9c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a9d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a9e0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  (v, OP_MakeIdxKe
a9f0: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  y, pIndex->nColu
aa00: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mn, 0);.      sq
aa10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aa20: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
aa30: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
aa40: 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20  OE_None);.      
aa50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aa60: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
aa70: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
aa80: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
aa90: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
aaa0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
aab0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
aac0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
aad0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
aae0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
aaf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ab00: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
ab10: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
ab20: 0a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 43  .        changeC
ab30: 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20  ookie(db);.     
ab40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ab50: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
ab60: 69 65 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  ie, db->next_coo
ab70: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  kie, 0);.       
ab80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ab90: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
aba0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
abb0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
abc0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
abd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
abe0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
abf0: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
ac00: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
ac10: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
ac20: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
ac30: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
ac40: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
ac50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ac60: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
ac70: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
ac80: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
ac90: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
aca0: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
acb0: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
acc0: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
acd0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
ace0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
acf0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
ad00: 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ex;.  char *zNam
ad10: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
ad20: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
ad30: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
ad40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
ad50: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
ad60: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
ad70: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
ad80: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
ad90: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
ada0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
adb0: 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  n;.  pIndex = sq
adc0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
add0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
ade0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
adf0: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
ae00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
ae10: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
ae20: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
ae30: 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a  h index: ", 0, .
ae40: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
ae50: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
ae60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
ae70: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
ae80: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
ae90: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
aea0: 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
aeb0: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
aec0: 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
aed0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
aee0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
aef0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
af00: 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d  Op dropIndex[] =
af10: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70   {.      { OP_Op
af20: 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20  enWrite,  0, 2, 
af30: 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d        MASTER_NAM
af40: 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  E},.      { OP_R
af50: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
af60: 44 52 28 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20  DR(10),0}, .    
af70: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
af80: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
af90: 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20  }, /* 2 */.     
afa0: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
afb0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
afc0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
afd0: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
afe0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f       0}, /* 4 */
aff0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
b000: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
b010: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
b020: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
b030: 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20  , ADDR(9), 0},. 
b040: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
b050: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 34 29        0, ADDR(4)
b060: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
b070: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
b080: 41 44 44 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20  ADDR(10),0},.   
b090: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
b0a0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
b0b0: 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20  0}, /* 9 */.    
b0c0: 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65    { OP_SetCookie
b0d0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30  ,  0, 0,       0
b0e0: 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20  }, /* 10 */.    
b0f0: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
b100: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
b110: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
b120: 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c  t base;.    Tabl
b130: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
b140: 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73  ->pTable;..    s
b150: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
b160: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
b170: 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 2d  ;.    if( !pTab-
b180: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  >isTemp ){.     
b190: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
b1a0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
b1b0: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64  rraySize(dropInd
b1c0: 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b  ex), dropIndex);
b1d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b1e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
b1f0: 65 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+2, pIndex->zNa
b200: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
b210: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
b220: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71  ie(db);.      sq
b230: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31  liteVdbeChangeP1
b240: 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64 62 2d  (v, base+10, db-
b250: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20  >next_cookie);. 
b260: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
b270: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
b280: 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e  estroy, pIndex->
b290: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65  tnum, pTab->isTe
b2a0: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  mp);.    sqliteE
b2b0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
b2c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
b2d0: 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 69 6e 64   /* Move the ind
b2e0: 65 78 20 6f 6e 74 6f 20 74 68 65 20 70 65 6e 64  ex onto the pend
b2f0: 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e 20  ing DROP queue. 
b300: 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e 64 65   Or, if the inde
b310: 78 20 77 61 73 0a 20 20 2a 2a 20 6e 65 76 65 72  x was.  ** never
b320: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74   committed, just
b330: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 6e 64   delete it.  Ind
b340: 69 63 65 73 20 6f 6e 20 74 68 65 20 70 65 6e 64  ices on the pend
b350: 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 0a 20  ing DROP queue. 
b360: 20 2a 2a 20 67 65 74 20 64 65 6c 65 74 65 64 20   ** get deleted 
b370: 62 79 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  by sqliteCommitI
b380: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29  nternalChanges()
b390: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 65   when the user e
b3a0: 78 65 63 75 74 65 73 0a 20 20 2a 2a 20 61 20 43  xecutes.  ** a C
b3b0: 4f 4d 4d 49 54 2e 20 20 4f 72 20 69 66 20 61 20  OMMIT.  Or if a 
b3c0: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
b3d0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
b3e0: 20 74 68 65 20 44 52 4f 50 20 71 75 65 75 65 0a   the DROP queue.
b3f0: 20 20 2a 2a 20 61 72 65 20 6d 6f 76 65 64 20 62    ** are moved b
b400: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ack into the mai
b410: 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20  n hash table..  
b420: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
b430: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
b440: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
b450: 6f 70 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  opIndex(db, pInd
b460: 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ex);.    db->fla
b470: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
b480: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
b490: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
b4a0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
b4b0: 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
b4c0: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
b4d0: 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
b4e0: 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
b4f0: 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
b500: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
b510: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
b520: 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
b530: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
b540: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
b550: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
b560: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
b570: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
b580: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
b590: 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
b5a0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
b5b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b5c0: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20  if( (pList->nId 
b5d0: 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  & 7)==0 ){.    s
b5e0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
b5f0: 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71  m *a;.    a = sq
b600: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
b610: 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49  t->a, (pList->nI
b620: 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  d+8)*sizeof(pLis
b630: 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
b640: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
b650: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
b660: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
b670: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b680: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
b690: 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  = a;.  }.  memse
b6a0: 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
b6b0: 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65  t->nId], 0, size
b6c0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
b6d0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
b6e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
b6f0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
b700: 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->nId].zName;. 
b710: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
b720: 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ing(pz, pToken->
b730: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
b740: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
b750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b760: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
b770: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
b780: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
b790: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
b7a0: 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a  ote(*pz);.    }.
b7b0: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64    }.  pList->nId
b7c0: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
b7d0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  st;.}../*.** Add
b7e0: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
b7f0: 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72   last identifier
b800: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64   on the given id
b810: 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a  entifier list..*
b820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
b830: 69 73 74 41 64 64 41 6c 69 61 73 28 49 64 4c 69  istAddAlias(IdLi
b840: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
b850: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
b860: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
b870: 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e  >nId>0 ){.    in
b880: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  t i = pList->nId
b890: 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   - 1;.    sqlite
b8a0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
b8b0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
b8c0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
b8d0: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
b8e0: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
b8f0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
b900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
b910: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 49  lete an entire I
b920: 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
b930: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b940: 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
b950: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
b960: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
b970: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
b980: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
b990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
b9a0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
b9b0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
b9c0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
b9d0: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
b9e0: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  ( pList->a[i].pT
b9f0: 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  ab && pList->a[i
ba00: 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
ba10: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
ba20: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
ba30: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  , pList->a[i].pT
ba40: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
ba50: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
ba60: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  e(pList->a[i].pS
ba70: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 73 71  elect);.  }.  sq
ba80: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
ba90: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
baa0: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
bab0: 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61  * The COPY comma
bac0: 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70 61 74  nd is for compat
bad0: 69 62 69 6c 69 74 79 20 77 69 74 68 20 50 6f 73  ibility with Pos
bae0: 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70 65 63  tgreSQL and spec
baf0: 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72  ificially.** for
bb00: 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
bb10: 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74 20  read the output 
bb20: 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54 68 65  of pg_dump.  The
bb30: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a   format is as.**
bb40: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bb50: 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20 46 52     COPY table FR
bb60: 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47 20 44  OM file [USING D
bb70: 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69 6e 67  ELIMITERS string
bb80: 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20  ].**.** "table" 
bb90: 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  is an existing t
bba0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20 77  able name.  We w
bbb0: 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73 20 6f  ill read lines o
bbc0: 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66  f code from.** f
bbd0: 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68 69 73  ile to fill this
bbe0: 20 74 61 62 6c 65 20 77 69 74 68 20 64 61 74 61   table with data
bbf0: 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20 62 65  .  File might be
bc00: 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65 20 6f   "stdin".  The o
bc10: 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d  ptional.** delim
bc20: 69 74 65 72 20 73 74 72 69 6e 67 20 69 64 65 6e  iter string iden
bc30: 74 69 66 69 65 73 20 74 68 65 20 66 69 65 6c 64  tifies the field
bc40: 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 54 68   separators.  Th
bc50: 65 20 64 65 66 61 75 6c 74 20 69 73 20 61 20 74  e default is a t
bc60: 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ab..*/.void sqli
bc70: 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20  teCopy(.  Parse 
bc80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
bc90: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
bca0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
bcb0: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f  *pTableName,   /
bcc0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
bcd0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
bce0: 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72  ch we will inser
bcf0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46  t */.  Token *pF
bd00: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54  ilename,    /* T
bd10: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
bd20: 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66  ch to obtain inf
bd30: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  ormation */.  To
bd40: 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72 2c  ken *pDelimiter,
bd50: 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 61     /* Use this a
bd60: 73 20 74 68 65 20 66 69 65 6c 64 20 64 65 6c 69  s the field deli
bd70: 6d 69 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  miter */.  int o
bd80: 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20  nError          
bd90: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 69 66  /* What to do if
bda0: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61   a constraint fa
bdb0: 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ils */.){.  Tabl
bdc0: 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20  e *pTab;.  char 
bdd0: 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *zTab;.  int i;.
bde0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
bdf0: 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e   addr, end;.  In
be00: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 73 71 6c  dex *pIdx;.  sql
be10: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
be20: 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62 20 3d 20  ->db;..  zTab = 
be30: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
be40: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e  romToken(pTableN
be50: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
be60: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
be70: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 67 6f   || zTab==0 ) go
be80: 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b  to copy_cleanup;
be90: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
bea0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
beb0: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ab);.  sqliteFre
bec0: 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 70  e(zTab);.  if( p
bed0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
bee0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
bef0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
bf00: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
bf10: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
bf20: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70  pTableName->z, p
bf30: 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30 29  TableName->n, 0)
bf40: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
bf50: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63  rr++;.    goto c
bf60: 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  opy_cleanup;.  }
bf70: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
bf80: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
bf90: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
bfa0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
bfb0: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
bfc0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 22 20  Name,.        " 
bfd0: 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  may not be modif
bfe0: 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ied", 0);.    pP
bff0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
c000: 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61    goto copy_clea
c010: 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  nup;.  }.  v = s
c020: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
c030: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
c040: 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b  .    int openOp;
c050: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
c060: 4d 75 6c 74 69 57 72 69 74 65 4f 70 65 72 61 74  MultiWriteOperat
c070: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
c080: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
c090: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
c0a0: 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  leOpen, 0, 0);. 
c0b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c0c0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
c0d0: 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69  Filename->z, pFi
c0e0: 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20  lename->n);.    
c0f0: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
c100: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
c110: 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d    openOp = pTab-
c120: 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65  >isTemp ? OP_Ope
c130: 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e  nWrAux : OP_Open
c140: 57 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69 74  Write;.    sqlit
c150: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
c160: 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74  enOp, 0, pTab->t
c170: 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  num);.    sqlite
c180: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
c190: 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  -1, pTab->zName,
c1a0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
c1b0: 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70   for(i=1, pIdx=p
c1c0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c1d0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c1e0: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
c1f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c200: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70  (v, openOp, i, p
c210: 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Idx->tnum);.    
c220: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
c230: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78  geP3(v, -1, pIdx
c240: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
c250: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  IC);.    }.    i
c260: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
c270: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
c280: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
c290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c2a0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20  nteger, 0, 0);  
c2b0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
c2c0: 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  e row count */. 
c2d0: 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73     }.    end = s
c2e0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
c2f0: 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20  el(v);.    addr 
c300: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
c310: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64  p(v, OP_FileRead
c320: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e  , pTab->nCol, en
c330: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c  d);.    if( pDel
c340: 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  imiter ){.      
c350: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
c360: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c  P3(v, addr, pDel
c370: 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69  imiter->z, pDeli
c380: 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20  miter->n);.     
c390: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
c3a0: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
c3b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c3c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
c3d0: 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22  P3(v, addr, "\t"
c3e0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
c3f0: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
c400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c410: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c420: 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54  P_FileColumn, pT
c430: 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20  ab->iPKey, 0);. 
c440: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c450: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
c460: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
c470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
c480: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c490: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
c4a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
c4b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
c4c0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c4d0: 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69    if( i==pTab->i
c4e0: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
c4f0: 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 70  /* The integer p
c500: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
c510: 6e 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  n is filled with
c520: 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a   NULL since its.
c530: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
c540: 20 69 73 20 61 6c 77 61 79 73 20 70 75 6c 6c 65   is always pulle
c550: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  d from the recor
c560: 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  d number */.    
c570: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c580: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
c590: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
c5a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c5b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c5c0: 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20   OP_FileColumn, 
c5d0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i, 0);.      }. 
c5e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 47     }.    sqliteG
c5f0: 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
c600: 74 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20  tChecks(pParse, 
c610: 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30  pTab, 0, 0, 0, 0
c620: 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29  , onError, addr)
c630: 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70  ;.    sqliteComp
c640: 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50  leteInsertion(pP
c650: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
c660: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
c670: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
c680: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21  LITE_CountRows)!
c690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c6a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c6b0: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b  P_AddImm, 1, 0);
c6c0: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72    /* Increment r
c6d0: 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ow count */.    
c6e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
c6f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
c700: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  , 0, addr);.    
c710: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
c720: 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a  eLabel(v, end);.
c730: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c740: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
c750: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
c760: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
c770: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
c780: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
c790: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
c7a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c7b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7c0: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20  ColumnCount, 1, 
c7d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
c7e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7f0: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30  ColumnName, 0, 0
c800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c810: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
c820: 31 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65  1, "rows inserte
c830: 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  d", P3_STATIC);.
c840: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c850: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
c860: 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20  back, 1, 0);.   
c870: 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63   }.  }.  .copy_c
c880: 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e  leanup:.  return
c890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
c8a0: 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55  on-standard VACU
c8b0: 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  UM command is us
c8c0: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  ed to clean up t
c8d0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
c8e0: 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70  collapse free sp
c8f0: 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73  ace, etc.  It is
c900: 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20   modelled after 
c910: 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  the VACUUM comma
c920: 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65  nd.** in Postgre
c930: 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 76 65  SQL..**.** In ve
c940: 72 73 69 6f 6e 20 31 2e 30 2e 78 20 6f 66 20 53  rsion 1.0.x of S
c950: 51 4c 69 74 65 2c 20 74 68 65 20 56 41 43 55 55  QLite, the VACUU
c960: 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f 75 6c 64 20  M command would 
c970: 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f 72 65 6f  call.** gdbm_reo
c980: 72 67 61 6e 69 7a 65 28 29 20 6f 6e 20 61 6c 6c  rganize() on all
c990: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
c9a0: 62 6c 65 73 2e 20 20 42 75 74 20 62 65 67 69 6e  bles.  But begin
c9b0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 32 2e 30  ning.** with 2.0
c9c0: 2e 30 2c 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .0, SQLite no lo
c9d0: 6e 67 65 72 20 75 73 65 73 20 47 44 42 4d 20 73  nger uses GDBM s
c9e0: 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 68  o this command h
c9f0: 61 73 0a 2a 2a 20 62 65 63 6f 6d 65 20 61 20 6e  as.** become a n
ca00: 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  o-op..*/.void sq
ca10: 6c 69 74 65 56 61 63 75 75 6d 28 50 61 72 73 65  liteVacuum(Parse
ca20: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
ca30: 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20  *pTableName){.  
ca40: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
ca50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
ca60: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
ca70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69  .void sqliteBegi
ca80: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
ca90: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
caa0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69  onError){.  sqli
cab0: 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70  te *db;..  if( p
cac0: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
cad0: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
cae0: 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72  | db->pBe==0 ) r
caf0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
cb00: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
cb10: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
cb20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
cb30: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
cb40: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 20 72  LITE_InTrans ) r
cb50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 42  eturn;.  sqliteB
cb60: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
cb70: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62  on(pParse);.  db
cb80: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cb90: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d  E_InTrans;.  db-
cba0: 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
cbb0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  or;.}../*.** Com
cbc0: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
cbd0: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
cbe0: 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
cbf0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
cc00: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
cc10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
cc20: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
cc30: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
cc40: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
cc50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
cc60: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
cc70: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
cc80: 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
cc90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
cca0: 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75  Trans)==0 ) retu
ccb0: 72 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  rn;.  db->flags 
ccc0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
ccd0: 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57  ns;.  sqliteEndW
cce0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
ccf0: 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45  arse);.  db->onE
cd00: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
cd10: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  t;.}../*.** Roll
cd20: 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
cd30: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
cd40: 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  eRollbackTransac
cd50: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
cd60: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
cd70: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
cd80: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
cd90: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
cda0: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
cdb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
cdc0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
cdd0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
cde0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
cdf0: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
ce00: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
ce10: 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ans)==0 ) return
ce20: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  ;.  v = sqliteGe
ce30: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ce40: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
ce50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ce60: 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c   OP_Rollback, 0,
ce70: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   0);.  }.  db->f
ce80: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
ce90: 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f  InTrans;.  db->o
cea0: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
ceb0: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ult;.}../*.** Ge
cec0: 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
ced0: 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
cee0: 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
cef0: 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
cf00: 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
cf10: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 70  atabase.  The op
cf20: 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  eration will be 
cf30: 61 74 6f 6d 69 63 20 69 6e 20 74 68 65 0a 2a 2a  atomic in the.**
cf40: 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 20 77   sense that it w
cf50: 69 6c 6c 20 65 69 74 68 65 72 20 64 6f 20 69 74  ill either do it
cf60: 73 20 63 68 61 6e 67 65 73 20 63 6f 6d 70 6c 65  s changes comple
cf70: 74 65 6c 79 20 6f 72 20 6e 6f 74 20 61 74 0a 2a  tely or not at.*
cf80: 2a 20 61 6c 6c 2e 20 20 53 6f 20 74 68 65 72 65  * all.  So there
cf90: 20 69 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   is not need to 
cfa0: 73 65 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  set a checkpoint
cfb0: 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
cfc0: 6e 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  n.** is already 
cfd0: 69 6e 20 65 66 66 65 63 74 2e 0a 2a 2f 0a 76 6f  in effect..*/.vo
cfe0: 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  id sqliteBeginWr
cff0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
d000: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
d010: 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71  dbe *v;.  v = sq
d020: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
d030: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
d040: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
d050: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
d060: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
d070: 61 6e 73 29 3d 3d 30 20 20 29 7b 0a 20 20 20 20  ans)==0  ){.    
d080: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d090: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
d0a0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  n, 0, 0);.    sq
d0b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d0c0: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
d0d0: 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63  , pParse->db->sc
d0e0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  hema_cookie, 0);
d0f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68  .    pParse->sch
d100: 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b  emaVerified = 1;
d110: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
d120: 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
d130: 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
d140: 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
d150: 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
d160: 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
d170: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 70  atabase.  The op
d180: 65 72 61 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f  eration might no
d190: 74 20 62 65 20 61 74 6f 6d 69 63 20 69 6e 0a 2a  t be atomic in.*
d1a0: 2a 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  * the sense that
d1b0: 20 61 6e 20 65 72 72 6f 72 20 6d 61 79 20 62 65   an error may be
d1c0: 20 64 69 73 63 6f 76 65 72 65 64 20 61 6e 64 20   discovered and 
d1d0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69  the operation mi
d1e0: 67 68 74 0a 2a 2a 20 61 62 6f 72 74 20 61 66 74  ght.** abort aft
d1f0: 65 72 20 73 6f 6d 65 20 63 68 61 6e 67 65 73 20  er some changes 
d200: 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20  have been made. 
d210: 20 49 66 20 77 65 20 61 72 65 20 69 6e 20 74 68   If we are in th
d220: 65 20 6d 69 64 64 6c 65 20 0a 2a 2a 20 6f 66 20  e middle .** of 
d230: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
d240: 68 65 6e 20 74 68 69 73 20 73 65 74 73 20 61 20  hen this sets a 
d250: 63 68 65 63 6b 70 6f 69 6e 74 2e 20 20 49 66 20  checkpoint.  If 
d260: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 0a 2a 2a  we are not in.**
d270: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
d280: 74 68 65 6e 20 73 74 61 72 74 20 61 20 74 72 61  then start a tra
d290: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
d2a0: 64 20 73 71 6c 69 74 65 42 65 67 69 6e 4d 75 6c  d sqliteBeginMul
d2b0: 74 69 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  tiWriteOperation
d2c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
d2d0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20  .  Vdbe *v;.  v 
d2e0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
d2f0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d300: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d310: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
d320: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d330: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
d340: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d350: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
d360: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
d370: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d380: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
d390: 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d  kie, pParse->db-
d3a0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20  >schema_cookie, 
d3b0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
d3c0: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
d3d0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
d3e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d3f0: 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  (v, OP_Checkpoin
d400: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.
d410: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d420: 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75  code that conclu
d430: 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  des an operation
d440: 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
d450: 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61  hanged.** the da
d460: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
d470: 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e   a companion fun
d480: 63 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72  ction to BeginWr
d490: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a  iteOperation()..
d4a0: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
d4b0: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
d4c0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e   then commit it.
d4d0: 20 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e    If a checkpoin
d4e0: 74 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64  t was.** started
d4f0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61   then commit tha
d500: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d510: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
d520: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
d530: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
d540: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
d550: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
d560: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
d570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
d580: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
d590: 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  _InTrans ){.    
d5a0: 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f  /* Do Nothing */
d5b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
d5c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d5d0: 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30   OP_Commit, 0, 0
d5e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
d5f0: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67   Interpret the g
d600: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
d610: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a   boolean value..
d620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
d630: 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a  tBoolean(char *z
d640: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
d650: 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22   *azTrue[] = { "
d660: 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75  yes", "on", "tru
d670: 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e" };.  int i;. 
d680: 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72   if( z[0]==0 ) r
d690: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69  eturn 0;.  if( i
d6a0: 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20  sdigit(z[0]) || 
d6b0: 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73  (z[0]=='-' && is
d6c0: 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a  digit(z[1])) ){.
d6d0: 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28      return atoi(
d6e0: 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  z);.  }.  for(i=
d6f0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72  0; i<sizeof(azTr
d700: 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75  ue)/sizeof(azTru
d710: 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  e[0]); i++){.   
d720: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
d730: 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d  mp(z,azTrue[i])=
d740: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
d750: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
d760: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
d770: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
d780: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
d790: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
d7a0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
d7b0: 20 50 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c   PRAGMA id = val
d7c0: 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65  ue.**.** The ide
d7d0: 6e 74 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c  ntifier might al
d7e0: 73 6f 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20  so be a string. 
d7f0: 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20   The value is a 
d800: 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69  string, and.** i
d810: 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20  dentifier, or a 
d820: 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75  number.  If minu
d830: 73 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  sFlag is true, t
d840: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73  hen the value is
d850: 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61  .** a number tha
d860: 74 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  t was preceded b
d870: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
d880: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72  */.void sqlitePr
d890: 61 67 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  agma(Parse *pPar
d8a0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74  se, Token *pLeft
d8b0: 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c  , Token *pRight,
d8c0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
d8d0: 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d  .  char *zLeft =
d8e0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67   0;.  char *zRig
d8f0: 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ht = 0;.  sqlite
d900: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d910: 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71  b;..  zLeft = sq
d920: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66  liteStrNDup(pLef
d930: 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b  t->z, pLeft->n);
d940: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
d950: 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d  (zLeft);.  if( m
d960: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
d970: 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  zRight = 0;.    
d980: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
d990: 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31  (&zRight, "-", 1
d9a0: 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69  , pRight->z, pRi
d9b0: 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65  ght->n, 0);.  }e
d9c0: 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20  lse{.    zRight 
d9d0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
d9e0: 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68  pRight->z, pRigh
d9f0: 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  t->n);.    sqlit
da00: 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29  eDequote(zRight)
da10: 3b 0a 20 20 7d 0a 20 0a 20 20 69 66 28 20 73 71  ;.  }. .  if( sq
da20: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
da30: 74 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d  t,"cache_size")=
da40: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 69  =0 ){.    int si
da50: 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74  ze = atoi(zRight
da60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 74 72  );.    sqliteBtr
da70: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64  eeSetCacheSize(d
da80: 62 2d 3e 70 42 65 2c 20 73 69 7a 65 29 3b 0a 20  b->pBe, size);. 
da90: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
daa0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
dab0: 74 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29  t, "vdbe_trace")
dac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
dad0: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
dae0: 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
daf0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56  lags |= SQLITE_V
db00: 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65  dbeTrace;.    }e
db10: 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
db20: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
db30: 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d  VdbeTrace;.    }
db40: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
db50: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
db60: 65 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d  eft, "full_colum
db70: 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a  n_names")==0 ){.
db80: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
db90: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
dba0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
dbb0: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
dbc0: 61 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ames;.    }else{
dbd0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
dbe0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
dbf0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a  ColNames;.    }.
dc00: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
dc10: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
dc20: 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74 5f  ft, "result_set_
dc30: 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a  details")==0 ){.
dc40: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
dc50: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
dc60: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
dc70: 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65   SQLITE_ResultDe
dc80: 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65  tails;.    }else
dc90: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
dca0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73  s &= ~SQLITE_Res
dcb0: 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20  ultDetails;.    
dcc0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
dcd0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
dce0: 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61  Left, "count_cha
dcf0: 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nges")==0 ){.   
dd00: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
dd10: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
dd20: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
dd30: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a  LITE_CountRows;.
dd40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd50: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
dd60: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b  QLITE_CountRows;
dd70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
dd80: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
dd90: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74  Cmp(zLeft, "empt
dda0: 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63  y_result_callbac
ddb0: 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ks")==0 ){.    i
ddc0: 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
ddd0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
dde0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
ddf0: 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b  TE_NullCallback;
de00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
de10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
de20: 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
de30: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ack;.    }.  }el
de40: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
de50: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
de60: 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20  table_info")==0 
de70: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
de80: 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
de90: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
dea0: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
deb0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
dec0: 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69   pTab ) v = sqli
ded0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
dee0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
def0: 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
df00: 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
df10: 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
df20: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
df30: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20  ColumnCount, 5, 
df40: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
df50: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
df60: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
df70: 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
df80: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
df90: 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
dfa0: 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
dfb0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
dfc0: 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
dfd0: 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20  "type"},.       
dfe0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
dff0: 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  3, 0,       "
e000: 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20  notnull"},.     
e010: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
e020: 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20  me,  4, 0,      
e030: 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a   "dflt_value"},.
e040: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
e050: 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
e060: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
e070: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62  v, ArraySize(tab
e080: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20  leInfoPreface), 
e090: 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
e0a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
e0b0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
e0c0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
e0d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e0e0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
e0f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
e100: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e110: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
e120: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e140: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
e150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
e160: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
e170: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
e180: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
e190: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e1b0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
e1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
e1d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
e1e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61   .           pTa
e1f0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  b->aCol[i].zType
e200: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d   ? pTab->aCol[i]
e210: 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c  .zType : "text",
e220: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
e230: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
e240: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
e250: 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  er, pTab->aCol[i
e260: 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20  ].notNull, 0);. 
e270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
e280: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
e290: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
e2a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
e2b0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
e2c0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  ab->aCol[i].zDfl
e2d0: 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  t, P3_STATIC);. 
e2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
e2f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
e300: 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20  lback, 5, 0);.  
e310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
e320: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
e330: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
e340: 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30  "index_info")==0
e350: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
e360: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
e370: 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a  pTab;.    Vdbe *
e380: 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  v;.    pIdx = sq
e390: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
e3a0: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69  , zRight);.    i
e3b0: 66 28 20 70 49 64 78 20 29 20 76 20 3d 20 73 71  f( pIdx ) v = sq
e3c0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
e3d0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  se);.    if( pId
e3e0: 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20  x && v ){.      
e3f0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61  static VdbeOp ta
e400: 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d  bleInfoPreface[]
e410: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
e420: 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33  P_ColumnCount, 3
e430: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
e440: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
e450: 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
e460: 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20       "seqno"},. 
e470: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
e480: 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20  mnName,  1, 0,  
e490: 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20       "cid"},.   
e4a0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
e4b0: 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
e4c0: 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20     "name"},.    
e4d0: 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69    };.      int i
e4e0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
e4f0: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
e500: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e510: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
e520: 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65  ize(tableInfoPre
e530: 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f  face), tableInfo
e540: 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20  Preface);.      
e550: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
e560: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
e570: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d          int cnum
e580: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
e590: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  n[i];.        sq
e5a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e5b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
e5c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
e5d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e5e0: 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c  P_Integer, cnum,
e5f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
e600: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e610: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
e620: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e630: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75  ( pTab->nCol>cnu
e640: 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  m );.        sql
e650: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
e660: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f  v, -1, pTab->aCo
e670: 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50  l[cnum].zName, P
e680: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
e690: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e6a0: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
e6b0: 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20  k, 3, 0);.      
e6c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
e6d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
e6e0: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64  ICmp(zLeft, "ind
e6f0: 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a  ex_list")==0 ){.
e700: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
e710: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e720: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
e730: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
e740: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52  FindTable(db, zR
e750: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ight);.    if( p
e760: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  Tab ){.      v =
e770: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
e780: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49  Parse);.      pI
e790: 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  dx = pTab->pInde
e7a0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
e7b0: 20 70 54 61 62 20 26 26 20 70 49 64 78 20 26 26   pTab && pIdx &&
e7c0: 20 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   v ){.      int 
e7d0: 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74  i = 0; .      st
e7e0: 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65  atic VdbeOp inde
e7f0: 78 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d  xListPreface[] =
e800: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
e810: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20  ColumnCount, 3, 
e820: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
e830: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
e840: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
e850: 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20     "seq"},.     
e860: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
e870: 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
e880: 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
e890: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
e8a0: 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
e8b0: 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20  "unique"},.     
e8c0: 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   };..      sqlit
e8d0: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
e8e0: 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65  , ArraySize(inde
e8f0: 78 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20 69  xListPreface), i
e900: 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
e910: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70 49  ;.      while(pI
e920: 64 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  dx){.        sql
e930: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e940: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
e950: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e960: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e970: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
e980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
e990: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
e9a0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
e9b0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
e9c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e9d0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
e9e0: 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  , pIdx->onError!
e9f0: 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20  =OE_None, 0);.  
ea00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ea10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
ea20: 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 09 2b 2b  back, 3, 0);..++
ea30: 69 3b 0a 09 70 49 64 78 20 3d 20 70 49 64 78 2d  i;..pIdx = pIdx-
ea40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
ea50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
ea60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
ea70: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ea80: 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72  p(zLeft, "parser
ea90: 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20  _trace")==0 ){. 
eaa0: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
eab0: 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65  qliteParserTrace
eac0: 28 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b  (FILE*, char *);
ead0: 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
eae0: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
eaf0: 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65       sqliteParse
eb00: 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22  rTrace(stdout, "
eb10: 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20  parser: ");.    
eb20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
eb30: 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 30  iteParserTrace(0
eb40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
eb50: 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
eb60: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
eb70: 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69 74  zLeft, "integrit
eb80: 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a  y_check")==0 ){.
eb90: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
eba0: 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a  p checkDb[] = {.
ebb0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e        { OP_SetIn
ebc0: 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20  sert,   0, 0,   
ebd0: 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20       "2"},.     
ebe0: 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20   { OP_Open,     
ebf0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
ec00: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
ec10: 65 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20 36  ewind,      0, 6
ec20: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
ec30: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
ec40: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
ec50: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
ec60: 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c  _SetInsert,   0,
ec70: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
ec80: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
ec90: 20 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20         0, 3,    
eca0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
ecb0: 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20  OP_IntegrityCk, 
ecc0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
ecd0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
ece0: 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20  mnCount, 1, 0,  
ecf0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
ed00: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
ed10: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
ed20: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
ed30: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
ed40: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
ed50: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
ed60: 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
ed70: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
ed80: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
ed90: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
eda0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
edb0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
edc0: 69 7a 65 28 63 68 65 63 6b 44 62 29 2c 20 63 68  ize(checkDb), ch
edd0: 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a  eckDb);.  }else.
ede0: 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72  .  {}.  sqliteFr
edf0: 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c  ee(zLeft);.  sql
ee00: 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
ee10: 0a 7d 0a                                         .}.