/ Hex Artifact Content
Login

Artifact 2f6d3136e6b824b2b446c54db2d2be5703033203:


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 31 20 32 30 30  ild.c,v 1.81 200
0310: 32 2f 30 33 2f 30 32 20 31 37 3a 30 34 3a 30 38  2/03/02 17:04:08
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 2c 20 61 64 64 72 3b 0a 20 20 20 20  nt n, addr;.    
60c0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20  Vdbe *v;..    v 
60d0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
60e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
60f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
6100: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
6110: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6120: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c  _CreateTable, 0,
6130: 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20   p->isTemp);.   
6140: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6150: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
6160: 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50  ar *)&p->tnum, P
6170: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
6180: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  p->tnum = 0;.   
6190: 20 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20   if( !p->isTemp 
61a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
61b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
61c0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
61d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
61e0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
61f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
6200: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6210: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
6220: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6230: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6240: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6250: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
6260: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6270: 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  v, -1, p->zName,
6280: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
6290: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
62a0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
62b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
62c0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
62d0: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
62e0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
62f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6300: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34  dOp(v, OP_Dup, 4
6310: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6320: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6330: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6340: 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
6350: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ct ){.        ch
6360: 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61  ar *z = createTa
6370: 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  bleStmt(p);.    
6380: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
6390: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
63a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
63b0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20  ngeP3(v, -1, z, 
63c0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
63d0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
63e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
63f0: 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20  assert( pEnd!=0 
6400: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41  );.        n = A
6410: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
6420: 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72  ddr(pParse->sFir
6430: 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  stToken.z) + 1;.
6440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6450: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6460: 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  , pParse->sFirst
6470: 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20  Token.z, n);.   
6480: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6490: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
64a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
64b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
64c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
64d0: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
64e0: 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f  ;.      changeCo
64f0: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20  okie(db);.      
6500: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6510: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6520: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
6530: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6540: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6550: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6560: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
6570: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 69  elect ){.      i
6580: 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54 65 6d  nt op = p->isTem
6590: 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  p ? OP_OpenWrAux
65a0: 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   : OP_OpenWrite;
65b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
65c0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
65d0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
65e0: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
65f0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
6600: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
6610: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
6620: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
6630: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
6640: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6650: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
6660: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
6670: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
6680: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
6690: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
66a0: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
66b0: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
66c0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
66d0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
66e0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
66f0: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
6700: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
6710: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
6720: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
6730: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
6740: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
6750: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
6760: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
6770: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
6780: 63 74 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct    /* A SELEC
6790: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
67a0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
67b0: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 29 7b 0a   new view */.){.
67c0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
67d0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
67e0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 68    Table *p;.  ch
67f0: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 2c 20  ar *z;.  int n, 
6800: 6f 66 66 73 65 74 3b 0a 0a 20 20 73 71 6c 69 74  offset;..  sqlit
6810: 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  eStartTable(pPar
6820: 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d  se, pBegin, pNam
6830: 65 2c 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61  e, 0);.  p = pPa
6840: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
6850: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 67 6f 74    if( p==0 ) got
6860: 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
6870: 69 6c 65 64 3b 0a 20 20 70 2d 3e 70 53 65 6c 65  iled;.  p->pSele
6880: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
6890: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
68a0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
68b0: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
68c0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65  lect);.  if( pSe
68d0: 6c 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63  lTab==0 ) goto c
68e0: 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 65  reate_view_faile
68f0: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  d;.  assert( p->
6900: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  aCol==0 );.  p->
6910: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
6920: 6e 43 6f 6c 3b 0a 20 20 70 2d 3e 61 43 6f 6c 20  nCol;.  p->aCol 
6930: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
6940: 0a 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c  .  pSelTab->nCol
6950: 20 3d 20 30 3b 0a 20 20 70 53 65 6c 54 61 62 2d   = 0;.  pSelTab-
6960: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  >aCol = 0;.  sql
6970: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
6980: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 73 71  , pSelTab);.  sq
6990: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
69a0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 45 6e  (pSelect);.  sEn
69b0: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
69c0: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
69d0: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
69e0: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
69f0: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
6a00: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
6a10: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28  .n = 0;.  n = ((
6a20: 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69  int)sEnd.z) - (i
6a30: 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  nt)pBegin->z;.  
6a40: 7a 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e  z = p->pSelect->
6a50: 7a 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  zSelect = sqlite
6a60: 53 74 72 4e 44 75 70 28 70 42 65 67 69 6e 2d 3e  StrNDup(pBegin->
6a70: 7a 2c 20 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a  z, n+1);.  if( z
6a80: 3d 3d 30 20 29 20 67 6f 74 6f 20 63 72 65 61 74  ==0 ) goto creat
6a90: 65 5f 76 69 65 77 5f 66 61 69 6c 65 64 3b 0a 20  e_view_failed;. 
6aa0: 20 6f 66 66 73 65 74 20 3d 20 28 28 69 6e 74 29   offset = ((int)
6ab0: 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e  z) - (int)pBegin
6ac0: 2d 3e 7a 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ->z;.  sqliteSel
6ad0: 65 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70  ectMoveStrings(p
6ae0: 2d 3e 70 53 65 6c 65 63 74 2c 20 6f 66 66 73 65  ->pSelect, offse
6af0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 54  t);.  sqliteEndT
6b00: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45  able(pParse, &sE
6b10: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
6b20: 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66  ;..create_view_f
6b30: 61 69 6c 65 64 3a 0a 20 20 73 71 6c 69 74 65 53  ailed:.  sqliteS
6b40: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
6b50: 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ect);.  return;.
6b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
6b70: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
6b80: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
6b90: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
6ba0: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
6bb0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
6bc0: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
6bd0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
6be0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
6bf0: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
6c00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6c10: 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63  oken *pTok){.  c
6c20: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61  har *zName;.  Ta
6c30: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61  ble *pTab;.  zNa
6c40: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
6c50: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
6c60: 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ok);.  if( zName
6c70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6c80: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
6c90: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
6ca0: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  >db, zName);.  s
6cb0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
6cc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
6cd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
6ce0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
6cf0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
6d00: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20  ch table: ", 0, 
6d10: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a  .        pTok->z
6d20: 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20  , pTok->n, 0);. 
6d30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6d40: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6d50: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pTab;.}../*.** T
6d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6d70: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
6d80: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
6d90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6da0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
6db0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6dc0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
6dd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
6de0: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
6df0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
6e00: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
6e10: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
6e20: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  v;.  int base;. 
6e30: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
6e40: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
6e50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
6e60: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
6e70: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
6e80: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6e90: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
6ea0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
6eb0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
6ec0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6ed0: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
6ee0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
6ef0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
6f00: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
6f10: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
6f20: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
6f30: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
6f40: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
6f50: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
6f60: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
6f70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
6f80: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
6f90: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
6fa0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
6fb0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
6fc0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
6fd0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
6fe0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
6ff0: 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d  beOp dropTable[]
7000: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
7010: 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32  OpenWrite,  0, 2
7020: 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f  ,        MASTER_
7030: 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  NAME},.      { O
7040: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
7050: 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20   ADDR(9),  0},. 
7060: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
7070: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
7080: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
7090: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
70a0: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
70b0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
70c0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
70d0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
70e0: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 4 */.      { O
70f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
7100: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
7110: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
7120: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
7130: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
7140: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
7150: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
7160: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
7170: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 34 29        0, ADDR(4)
7180: 2c 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20  ,  0}, /* 8 */. 
7190: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
71a0: 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  kie,  0, 0,     
71b0: 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20     0}, /* 9 */. 
71c0: 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c       { OP_Close,
71d0: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
71e0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
71f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
7200: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
7210: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
7220: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rse);.    if( !p
7230: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b  Table->isTemp ){
7240: 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71  .      base = sq
7250: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
7260: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
7270: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
7280: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
7290: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
72a0: 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c  v, base+2, pTabl
72b0: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
72c0: 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65      changeCookie
72d0: 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (db);.      sqli
72e0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  teVdbeChangeP1(v
72f0: 2c 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65  , base+9, db->ne
7300: 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  xt_cookie);.    
7310: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
7320: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
7330: 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75  roy, pTable->tnu
7340: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
7350: 70 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  p);.    for(pIdx
7360: 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  =pTable->pIndex;
7370: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
7380: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
7390: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
73a0: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
73b0: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  Idx->tnum, pTabl
73c0: 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  e->isTemp);.    
73d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  }.    sqliteEndW
73e0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
73f0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
7400: 20 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20   Move the table 
7410: 28 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64  (and all its ind
7420: 69 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e  ices) to the pen
7430: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e  ding DROP queue.
7440: 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
7450: 20 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72   table was never
7460: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74   committed, just
7470: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20   delete it.  If 
7480: 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
7490: 61 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  as been committe
74a0: 64 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20  d and is placed 
74b0: 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  on the pending D
74c0: 52 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20  ROP queue, then 
74d0: 74 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  the.  ** delete 
74e0: 77 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20  will occur when 
74f0: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
7500: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78  rnalChanges() ex
7510: 65 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ecutes..  **.  *
7520: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
7530: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
7540: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
7550: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
7560: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
7570: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
7580: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
7590: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
75a0: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
75b0: 50 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65  PendingDropTable
75c0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
75d0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
75e0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
75f0: 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ges;.  }.}../*.*
7600: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
7610: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
7620: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
7630: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
7640: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
7650: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
7660: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
7670: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
7680: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
7690: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
76a0: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
76b0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
76c0: 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
76d0: 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
76e0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
76f0: 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
7700: 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
7710: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
7720: 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
7730: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
7740: 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
7750: 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
7760: 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
7770: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
7780: 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
7790: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
77a0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
77b0: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
77c0: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
77d0: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
77e0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
77f0: 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
7800: 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
7810: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
7820: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
7830: 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
7840: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
7850: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
7860: 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
7870: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49  id sqliteCreateI
7880: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
7890: 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20  Parse,   /* All 
78a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
78b0: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
78c0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
78d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
78e0: 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65  e index.  May be
78f0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
7900: 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e   *pTable,   /* N
7910: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
7920: 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20   to index.  Use 
7930: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7940: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
7950: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
7960: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
7970: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
7980: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
7990: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
79a0: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
79b0: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
79c0: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
79d0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
79e0: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
79f0: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
7a00: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7a10: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
7a20: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
7a30: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
7a40: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
7a50: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
7a60: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
7a70: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
7a80: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
7a90: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
7aa0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
7ab0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
7ac0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
7ad0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
7ae0: 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
7af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
7b00: 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
7b10: 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
7b20: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
7b30: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
7b40: 74 20 68 69 64 65 4e 61 6d 65 20 3d 20 30 3b 20  t hideName = 0; 
7b50: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7b60: 74 20 70 75 74 20 74 61 62 6c 65 20 6e 61 6d 65  t put table name
7b70: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
7b80: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  le */..  if( pPa
7b90: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
7ba0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
7bb0: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
7bc0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
7bd0: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
7be0: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
7bf0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
7c00: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
7c10: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
7c20: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
7c30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
7c40: 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me!=0 );.    pTa
7c50: 62 20 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65  b =  sqliteTable
7c60: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
7c70: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  , pTable);.  }el
7c80: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7c90: 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
7ca0: 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e  pTab =  pParse->
7cb0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  pNewTable;.  }. 
7cc0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
7cd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
7ce0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
7cf0: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
7d00: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
7d10: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7d20: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7d30: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
7d40: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
7d50: 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76     " may not hav
7d60: 65 20 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64  e new indices ad
7d70: 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ded", 0);.    pP
7d80: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
7d90: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
7da0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
7db0: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
7dc0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  t ){.    sqliteS
7dd0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
7de0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77  ->zErrMsg, "view
7df0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
7e00: 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  exed", 0);.    p
7e10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7e20: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
7e30: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
7e40: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
7e50: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 77 68  ex is created wh
7e60: 69 6c 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74  ile re-reading t
7e70: 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 73  he schema from s
7e80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
7e90: 2a 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  * but the table 
7ea0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7eb0: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  this index is a 
7ec0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
7ed0: 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c   it can.  ** onl
7ee0: 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
7ef0: 74 61 62 6c 65 20 74 68 61 74 20 74 68 69 73 20  table that this 
7f00: 69 6e 64 65 78 20 69 73 20 72 65 61 6c 6c 79 20  index is really 
7f10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7f20: 69 73 0a 20 20 2a 2a 20 6f 6e 65 20 77 68 6f 73  is.  ** one whos
7f30: 65 20 6e 61 6d 65 20 69 73 20 68 69 64 64 65 6e  e name is hidden
7f40: 20 62 65 68 69 6e 64 20 61 20 74 65 6d 70 6f 72   behind a tempor
7f50: 61 72 79 20 74 61 62 6c 65 20 77 69 74 68 20 74  ary table with t
7f60: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20  he same name..  
7f70: 2a 2a 20 53 69 6e 63 65 20 69 74 73 20 74 61 62  ** Since its tab
7f80: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 75 70 70  le has been supp
7f90: 72 65 73 73 65 64 2c 20 77 65 20 6e 65 65 64 20  ressed, we need 
7fa0: 74 6f 20 61 6c 73 6f 20 73 75 70 70 72 65 73 73  to also suppress
7fb0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e   the.  ** index.
7fc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
7fd0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20  se->initFlag && 
7fe0: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  pTab->isTemp ){.
7ff0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
8000: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
8010: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
8020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8030: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
8040: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
8050: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
8060: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
8070: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
8080: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
8090: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
80a0: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
80b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
80c0: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
80d0: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
80e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
80f0: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
8100: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
8110: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
8120: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
8130: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
8140: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
8150: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
8160: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
8170: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
8180: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
8190: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
81a0: 69 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77 65  is index, but we
81b0: 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 73   will not.  ** s
81c0: 74 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69 6e  tore its name in
81d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
81e0: 20 20 53 65 74 20 74 68 65 20 68 69 64 65 4e 61    Set the hideNa
81f0: 6d 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f 6d  me flag to accom
8200: 70 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73 2e  plish.  ** this.
8210: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
8220: 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
8230: 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
8240: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
8250: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
8260: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
8270: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
8280: 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
8290: 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
82a0: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
82b0: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
82c0: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
82d0: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
82e0: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
82f0: 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
8300: 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
8310: 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
8320: 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
8330: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
8340: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
8350: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
8360: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8370: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
8380: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
8390: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
83a0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
83b0: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b  b, zName))!=0 ){
83c0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 53 61 6d  .      if( pISam
83d0: 65 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e 69  eName->pTable->i
83e0: 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d  sTemp && pParse-
83f0: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
8400: 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20       hideName = 
8410: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
8420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
8430: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
8440: 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  >zErrMsg, "index
8450: 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20   ", zName, .    
8460: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
8470: 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20   exists", 0);.  
8480: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
8490: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f  rr++;.        go
84a0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
84b0: 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
84c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53    }.    if( (pTS
84d0: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
84e0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
84f0: 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
8500: 20 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d 65    if( pTSameName
8510: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72  ->isTemp && pPar
8520: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
8530: 20 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65          hideName
8540: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
8550: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8560: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
8570: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68  se->zErrMsg, "th
8580: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
8590: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a   table named ",.
85a0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
85b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
85c0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
85d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
85e0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
85f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
8600: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
8610: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
8620: 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
8630: 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
8640: 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
8650: 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
8660: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
8670: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
8680: 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e  ntf(zBuf,"%d)",n
8690: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
86a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
86b0: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28  tring(&zName, "(
86c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
86d0: 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a  " autoindex ", z
86e0: 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Buf, 0);.    if(
86f0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
8700: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
8710: 65 78 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d 65  ex;.    hideName
8720: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
8730: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d 30  ex(db, zName)!=0
8740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  ;.  }..  /* If p
8750: 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
8760: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
8770: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
8780: 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
8790: 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
87a0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
87b0: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
87c0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
87d0: 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
87e0: 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
87f0: 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
8800: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
8810: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
8820: 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
8830: 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
8840: 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
8850: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c  .n = strlen(null
8860: 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
8870: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41   = sqliteIdListA
8880: 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64  ppend(0, &nullId
8890: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
88a0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
88b0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
88c0: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
88d0: 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
88e0: 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
88f0: 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  /.  pIndex = sql
8900: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
8910: 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65  f(Index) + strle
8920: 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20  n(zName) + 1 +. 
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e         sizeof(in
8950: 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b  t)*pList->nId );
8960: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
8970: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
8980: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e  ate_index;.  pIn
8990: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
89a0: 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d  (int*)&pIndex[1]
89b0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
89c0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64  e = (char*)&pInd
89d0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69  ex->aiColumn[pLi
89e0: 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63  st->nId];.  strc
89f0: 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
8a00: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
8a10: 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
8a20: 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
8a30: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49  lumn = pList->nI
8a40: 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  d;.  pIndex->onE
8a50: 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 69  rror = pIndex->i
8a60: 73 55 6e 69 71 75 65 20 3d 20 6f 6e 45 72 72 6f  sUnique = onErro
8a70: 72 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68  r;..  /* Scan th
8a80: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
8a90: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
8aa0: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
8ab0: 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
8ac0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
8ad0: 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
8ae0: 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
8af0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
8b00: 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
8b10: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
8b20: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8b30: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
8b40: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
8b50: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
8b60: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8b70: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
8b80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
8b90: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
8ba0: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
8bb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
8bc0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
8bd0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
8be0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8bf0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
8c00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
8c10: 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20         " has no 
8c20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20  column named ", 
8c30: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
8c40: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  e, 0);.      pPa
8c50: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
8c60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
8c70: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
8c80: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
8c90: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
8ca0: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
8cb0: 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f  i] = j;.  }..  /
8cc0: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
8cd0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
8ce0: 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
8cf0: 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
8d00: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
8d10: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
8d20: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50   .  */.  if( !pP
8d30: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
8d40: 20 21 68 69 64 65 4e 61 6d 65 20 29 7b 0a 20 20   !hideName ){.  
8d50: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
8d60: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  p = sqliteHashIn
8d70: 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48 61 73  sert(&db->idxHas
8d80: 68 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  h, pIndex->zName
8d90: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
8da0: 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
8db0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
8dc0: 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
8dd0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
8de0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
8df0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
8e00: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
8e10: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
8e20: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
8e30: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
8e40: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
8e50: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
8e60: 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
8e70: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
8e80: 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
8e90: 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
8ea0: 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
8eb0: 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
8ec0: 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
8ed0: 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
8ee0: 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
8ef0: 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
8f00: 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
8f10: 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
8f20: 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
8f30: 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
8f40: 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  */.  if( onError
8f50: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
8f60: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
8f70: 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
8f80: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
8f90: 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
8fa0: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
8fb0: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
8fc0: 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
8fd0: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c   = pIndex;.  }el
8fe0: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
8ff0: 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
9000: 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28  ndex;.    while(
9010: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
9020: 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
9030: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
9040: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f  lace ){.      pO
9050: 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
9060: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
9070: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
9080: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
9090: 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
90a0: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a   = pIndex;.  }..
90b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
90c0: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
90d0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
90e0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
90f0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
9100: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
9110: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
9120: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
9130: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
9140: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
9150: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f  table number fro
9160: 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65  m the pParse->ne
9170: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a  wTnum field..  *
9180: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
9190: 69 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62  initFlag && pTab
91a0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  le!=0 ){.    pIn
91b0: 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72  dex->tnum = pPar
91c0: 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  se->newTnum;.  }
91d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e  ..  /* If the in
91e0: 69 74 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e  itFlag is 0 then
91f0: 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
9200: 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
9210: 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
9220: 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
9230: 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
9240: 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
9250: 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
9260: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
9270: 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
9280: 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
9290: 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  The initFlag is 
92a0: 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
92b0: 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
92c0: 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
92d0: 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20  * command.  The 
92e0: 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77 68  initFlag is 1 wh
92f0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73  en a database is
9300: 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a   opened and .  *
9310: 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  * CREATE INDEX s
9320: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65  tatements are re
9330: 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ad out of the ma
9340: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a  ster table.  In.
9350: 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20    ** the latter 
9360: 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61  case the index a
9370: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e  lready exists on
9380: 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20   disk, which is 
9390: 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  why.  ** we don'
93a0: 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61  t want to recrea
93b0: 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  te it..  **.  **
93c0: 20 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74   If pTable==0 it
93d0: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
93e0: 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
93f0: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
9400: 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
9410: 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
9420: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9430: 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
9440: 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
9450: 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
9460: 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
9470: 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
9480: 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
9490: 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
94a0: 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
94b0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
94c0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d  Parse->initFlag=
94d0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  =0 ){.    int n;
94e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
94f0: 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32    int lbl1, lbl2
9500: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
9510: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69   int addr;.    i
9520: 6e 74 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62  nt isTemp = pTab
9530: 2d 3e 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20 76  ->isTemp;..    v
9540: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
9550: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
9560: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
9570: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9580: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21  .    if( pTable!
9590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
95a0: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
95b0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
95c0: 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70       if( !isTemp
95d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
95e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
95f0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
9600: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
9610: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
9620: 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  , -1, MASTER_NAM
9630: 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  E, P3_STATIC);. 
9640: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9650: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
9660: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9670: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
9680: 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
9690: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
96a0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
96b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
96c0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
96d0: 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c  (v, -1, "index",
96e0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
96f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9700: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
9710: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
9720: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
9730: 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65 78 2d 3e  (v, -1, pIndex->
9740: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
9750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9770: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
9780: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
9790: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
97a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
97b0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
97c0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
97d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
97e0: 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69 73  eateIndex, 0, is
97f0: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
9800: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
9810: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 26 70   addr, (char*)&p
9820: 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f  Index->tnum, P3_
9830: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49  POINTER);.    pI
9840: 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a  ndex->tnum = 0;.
9850: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
9860: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
9870: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  mp ){.        sq
9880: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9890: 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 2c 20 31   OP_OpenWrAux, 1
98a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
98b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
98c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
98d0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
98e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
98f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
9900: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
9910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9920: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
9930: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
9940: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9950: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
9960: 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74        if( pStart
9970: 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
9980: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
9990: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74  d->z) - Addr(pSt
99a0: 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20  art->z) + 1;.   
99b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
99c0: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
99d0: 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a   pStart->z, n);.
99e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
99f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9a00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
9a10: 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  5, 0);.      sql
9a20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9a30: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
9a40: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
9a50: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
9a60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9a70: 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f  Op(v, isTemp ? O
9a80: 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f  P_OpenAux : OP_O
9a90: 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  pen, 2, pTab->tn
9aa0: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
9ab0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
9ac0: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
9ad0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
9ae0: 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74      lbl2 = sqlit
9af0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
9b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9b10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
9b20: 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b  ewind, 2, lbl2);
9b30: 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
9b40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9b50: 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29   OP_Recno, 2, 0)
9b60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9b70: 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
9b80: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
9b90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9ba0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
9bb0: 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  2, pIndex->aiCol
9bc0: 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  umn[i]);.      }
9bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9be0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
9bf0: 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d  eIdxKey, pIndex-
9c00: 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >nColumn, 0);.  
9c10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9c20: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74  dOp(v, OP_IdxPut
9c30: 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  , 1, pIndex->onE
9c40: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a  rror!=OE_None);.
9c50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9c60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
9c70: 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 2, lbl1);.    
9c80: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
9c90: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32  lveLabel(v, lbl2
9ca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9cb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
9cc0: 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20  lose, 2, 0);.   
9cd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9ce0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
9cf0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
9d00: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
9d10: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  {.      if( !isT
9d20: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
9d30: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b  hangeCookie(db);
9d40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
9d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9d60: 65 74 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 6e 65  etCookie, db->ne
9d70: 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  xt_cookie, 0);. 
9d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
9da0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
9db0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   }.      sqliteE
9dc0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
9dd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
9de0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
9df0: 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
9e00: 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
9e10: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
9e20: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
9e30: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  st);.  sqliteFre
9e40: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
9e50: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
9e60: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
9e70: 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
9e80: 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
9e90: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
9ea0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
9eb0: 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
9ec0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9ed0: 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  eDropIndex(Parse
9ee0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9ef0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
9f00: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61 72   *pIndex;.  char
9f10: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20   *zName;.  Vdbe 
9f20: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *v;.  sqlite *db
9f30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9f40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
9f50: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
9f60: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
9f70: 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  urn;.  zName = s
9f80: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
9f90: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
9fa0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9fb0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65   return;.  pInde
9fc0: 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
9fd0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  dex(db, zName);.
9fe0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
9ff0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  me);.  if( pInde
a000: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
a010: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
a020: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
a030: 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 22  no such index: "
a040: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 4e  , 0, .        pN
a050: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
a060: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
a070: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
a080: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
a090: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
a0a0: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
a0b0: 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
a0c0: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
a0d0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
a0e0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
a0f0: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
a100: 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64  c VdbeOp dropInd
a110: 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ex[] = {.      {
a120: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20   OP_OpenWrite,  
a130: 30 2c 20 32 2c 20 20 20 20 20 20 20 4d 41 53 54  0, 2,       MAST
a140: 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20  ER_NAME},.      
a150: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
a160: 20 30 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c   0, ADDR(10),0},
a170: 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72   .      { OP_Str
a180: 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ing,     0, 0,  
a190: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f       0}, /* 2 */
a1a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
a1b0: 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
a1c0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
a1d0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
a1e0: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
a1f0: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 4 */.      { O
a200: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
a210: 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   1,       0},.  
a220: 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20      { OP_Eq,    
a230: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
a240: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
a250: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
a260: 44 44 52 28 34 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(4), 0},.    
a270: 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20    { OP_Goto,    
a280: 20 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c 30     0, ADDR(10),0
a290: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
a2a0: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
a2b0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a        0}, /* 9 *
a2c0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  /.      { OP_Set
a2d0: 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20  Cookie,  0, 0,  
a2e0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 30 20 2a       0}, /* 10 *
a2f0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f  /.      { OP_Clo
a300: 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20  se,      0, 0,  
a310: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
a320: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20      int base;.  
a330: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a340: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
a350: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
a360: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
a370: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a380: 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b  !pTab->isTemp ){
a390: 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71  .      base = sq
a3a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
a3b0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
a3c0: 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49  ropIndex), dropI
a3d0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndex);.      sql
a3e0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
a3f0: 76 2c 20 62 61 73 65 2b 32 2c 20 70 49 6e 64 65  v, base+2, pInde
a400: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
a410: 54 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  TIC);.      chan
a420: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
a430: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
a440: 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 31  angeP1(v, base+1
a450: 30 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  0, db->next_cook
a460: 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ie);.    }.    s
a470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a480: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
a490: 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  ndex->tnum, pTab
a4a0: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  ->isTemp);.    s
a4b0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
a4c0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
a4d0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74    }..  /* Move t
a4e0: 68 65 20 69 6e 64 65 78 20 6f 6e 74 6f 20 74 68  he index onto th
a4f0: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71  e pending DROP q
a500: 75 65 75 65 2e 20 20 4f 72 2c 20 69 66 20 74 68  ueue.  Or, if th
a510: 65 20 69 6e 64 65 78 20 77 61 73 0a 20 20 2a 2a  e index was.  **
a520: 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65 64   never committed
a530: 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20 69 74  , just delete it
a540: 2e 20 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68  .  Indices on th
a550: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71  e pending DROP q
a560: 75 65 75 65 0a 20 20 2a 2a 20 67 65 74 20 64 65  ueue.  ** get de
a570: 6c 65 74 65 64 20 62 79 20 73 71 6c 69 74 65 43  leted by sqliteC
a580: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
a590: 6e 67 65 73 28 29 20 77 68 65 6e 20 74 68 65 20  nges() when the 
a5a0: 75 73 65 72 20 65 78 65 63 75 74 65 73 0a 20 20  user executes.  
a5b0: 2a 2a 20 61 20 43 4f 4d 4d 49 54 2e 20 20 4f 72  ** a COMMIT.  Or
a5c0: 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
a5d0: 63 63 75 72 73 2c 20 74 68 65 20 65 6c 65 6d 65  ccurs, the eleme
a5e0: 6e 74 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20  nts of the DROP 
a5f0: 71 75 65 75 65 0a 20 20 2a 2a 20 61 72 65 20 6d  queue.  ** are m
a600: 6f 76 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  oved back into t
a610: 68 65 20 6d 61 69 6e 20 68 61 73 68 20 74 61 62  he main hash tab
a620: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
a630: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
a640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e  ){.    sqlitePen
a650: 64 69 6e 67 44 72 6f 70 49 6e 64 65 78 28 64 62  dingDropIndex(db
a660: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
a670: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
a680: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a690: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
a6a0: 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
a6b0: 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
a6c0: 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
a6d0: 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
a6e0: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
a6f0: 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
a700: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
a710: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
a720: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
a730: 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41  t *sqliteIdListA
a740: 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c  ppend(IdList *pL
a750: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
a760: 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
a770: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
a780: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
a790: 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
a7a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
a7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a7c0: 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74    }.  if( (pList
a7d0: 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b  ->nId & 7)==0 ){
a7e0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
a7f0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
a800: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
a810: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69  c(pList->a, (pLi
a820: 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f  st->nId+8)*sizeo
a830: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
a840: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
a850: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64  {.      sqliteId
a860: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
a870: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a880: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
a890: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
a8a0: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
a8b0: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30  a[pList->nId], 0
a8c0: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
a8d0: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
a8e0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  oken ){.    char
a8f0: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
a900: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e  a[pList->nId].zN
a910: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  ame;.    sqliteS
a920: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
a930: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
a940: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
a950: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
a960: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
a970: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
a980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a9a0: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
a9b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
a9c0: 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
a9d0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
a9e0: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
a9f0: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
aa00: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
aa10: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
aa20: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
aa30: 69 74 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61  iteIdListAddAlia
aa40: 73 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  s(IdList *pList,
aa50: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
aa60: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
aa70: 70 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a  pList->nId>0 ){.
aa80: 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
aa90: 74 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20  t->nId - 1;.    
aaa0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
aab0: 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  (&pList->a[i].zA
aac0: 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  lias, pToken->z,
aad0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a   pToken->n, 0);.
aae0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
aaf0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
ab00: 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  lias);.  }.}../*
ab10: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
ab20: 74 69 72 65 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  tire IdList..*/.
ab30: 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73  void sqliteIdLis
ab40: 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
ab50: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
ab60: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ab70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ab80: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
ab90: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
aba0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
abb0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
abc0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
abd0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
abe0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
abf0: 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73  [i].pTab && pLis
ac00: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73  t->a[i].pTab->is
ac10: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
ac20: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
ac30: 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61  able(0, pList->a
ac40: 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d  [i].pTab);.    }
ac50: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
ac60: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
ac70: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
ac80: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
ac90: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
aca0: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
acb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
acc0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
acd0: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
ace0: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
acf0: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
ad00: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
ad10: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
ad20: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
ad30: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
ad40: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
ad50: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
ad60: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
ad70: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
ad80: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
ad90: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
ada0: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
adb0: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
adc0: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
add0: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
ade0: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
adf0: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
ae00: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
ae10: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
ae20: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
ae30: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
ae40: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
ae50: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
ae60: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
ae70: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
ae80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ae90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
aea0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
aeb0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
aec0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  e,   /* The name
aed0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
aee0: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
aef0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
af00: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
af10: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
af20: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
af30: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
af40: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
af50: 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20  miter,   /* Use 
af60: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
af70: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20  d delimiter */. 
af80: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20   int onError    
af90: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
afa0: 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61   do if a constra
afb0: 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a  int fails */.){.
afc0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
afd0: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69   char *zTab;.  i
afe0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b  nt i;.  Vdbe *v;
aff0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64  .  int addr, end
b000: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
b010: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
b020: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a  pParse->db;..  z
b030: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
b040: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
b050: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66  TableName);.  if
b060: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
b070: 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d  failed || zTab==
b080: 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c  0 ) goto copy_cl
b090: 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20  eanup;.  pTab = 
b0a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
b0b0: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  db, zTab);.  sql
b0c0: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
b0d0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
b0e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
b0f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
b100: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
b110: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
b120: 20 20 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65        pTableName
b130: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
b140: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
b150: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
b160: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
b170: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  p;.  }.  if( pTa
b180: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
b190: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
b1a0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
b1b0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
b1c0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
b1d0: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
b1e0: 20 6d 6f 64 69 66 69 65 64 22 2c 20 30 29 3b 0a   modified", 0);.
b1f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
b200: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70  ++;.    goto cop
b210: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  y_cleanup;.  }. 
b220: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
b230: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
b240: 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( v ){.    int o
b250: 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74  penOp;.    sqlit
b260: 65 42 65 67 69 6e 4d 75 6c 74 69 57 72 69 74 65  eBeginMultiWrite
b270: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
b280: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
b290: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b2a0: 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c   OP_FileOpen, 0,
b2b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
b2c0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
b2d0: 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ddr, pFilename->
b2e0: 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29  z, pFilename->n)
b2f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
b300: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
b310: 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d  r);.    openOp =
b320: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20   pTab->isTemp ? 
b330: 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f  OP_OpenWrAux : O
b340: 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
b350: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b360: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70  (v, openOp, 0, p
b370: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
b380: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
b390: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
b3a0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
b3b0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
b3c0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
b3d0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b3e0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
b3f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b400: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
b410: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  , i, pIdx->tnum)
b420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b430: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
b440: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
b450: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
b460: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
b470: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
b480: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
b490: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b4a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b4b0: 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0);  /* Initial
b4c0: 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  ize the row coun
b4d0: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65  t */.    }.    e
b4e0: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
b4f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b500: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
b510: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
b520: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
b530: 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66  ol, end);.    if
b540: 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a  ( pDelimiter ){.
b550: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b560: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
b570: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c  , pDelimiter->z,
b580: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b   pDelimiter->n);
b590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b5a0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
b5b0: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
b5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b5d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
b5e0: 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20  , "\t", 1);.    
b5f0: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
b600: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
b610: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b620: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
b630: 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c  mn, pTab->iPKey,
b640: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b650: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b660: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
b670: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b680: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b690: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
b6a0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  no, 0, 0);.    }
b6b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b6c0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
b6d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
b6e0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
b6f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
b700: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
b710: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65   column is fille
b720: 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63  d with NULL sinc
b730: 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  e its.        **
b740: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
b750: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
b760: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
b770: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
b780: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b790: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
b7a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b7b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b7c0: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
b7d0: 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20  lumn, i, 0);.   
b7e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
b7f0: 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e  qliteGenerateCon
b800: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
b810: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
b820: 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c  , 0, 0, onError,
b830: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
b840: 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  teCompleteInsert
b850: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
b860: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
b870: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
b880: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
b890: 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  Rows)!=0 ){.    
b8a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b8b0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
b8c0: 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65  1, 0);  /* Incre
b8d0: 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  ment row count *
b8e0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
b8f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b900: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
b910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
b920: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b930: 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  end);.    sqlite
b940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b950: 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
b960: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
b970: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
b980: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
b990: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
b9a0: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20  ntRows ){.      
b9b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b9c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  v, OP_ColumnCoun
b9d0: 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
b9e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b9f0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
ba00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
ba10: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
ba20: 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69  3(v, -1, "rows i
ba30: 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41  nserted", P3_STA
ba40: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
ba50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ba60: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
ba70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
ba80: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  copy_cleanup:.  
ba90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
baa0: 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   The non-standar
bab0: 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  d VACUUM command
bac0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61   is used to clea
bad0: 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73  n up the databas
bae0: 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66  e,.** collapse f
baf0: 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20  ree space, etc. 
bb00: 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20   It is modelled 
bb10: 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d  after the VACUUM
bb20: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50   command.** in P
bb30: 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a  ostgreSQL..**.**
bb40: 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e   In version 1.0.
bb50: 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65  x of SQLite, the
bb60: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
bb70: 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64  would call.** gd
bb80: 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20  bm_reorganize() 
bb90: 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62  on all the datab
bba0: 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74  ase tables.  But
bbb0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
bbc0: 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65  th 2.0.0, SQLite
bbd0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
bbe0: 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d  GDBM so this com
bbf0: 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f  mand has.** beco
bc00: 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76  me a no-op..*/.v
bc10: 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d  oid sqliteVacuum
bc20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
bc30: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
bc40: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  e){.  /* Do noth
bc50: 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
bc60: 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
bc70: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
bc80: 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  teBeginTransacti
bc90: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
bca0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
bcb0: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
bcc0: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
bcd0: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
bce0: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
bcf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
bd00: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
bd10: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
bd20: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
bd30: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
bd40: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
bd50: 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ns ) return;.  s
bd60: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
bd70: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
bd80: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
bd90: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b   SQLITE_InTrans;
bda0: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
bdb0: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
bdc0: 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
bdd0: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
bde0: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e  sqliteCommitTran
bdf0: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
be00: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
be10: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
be20: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
be30: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
be40: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
be50: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
be60: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
be70: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
be80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
be90: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
bea0: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
beb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e  ) return;.  db->
bec0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
bed0: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69  _InTrans;.  sqli
bee0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
bef0: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64  ion(pParse);.  d
bf00: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
bf10: 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
bf20: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
bf30: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
bf40: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54   sqliteRollbackT
bf50: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
bf60: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
bf70: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
bf80: 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
bf90: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
bfa0: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
bfb0: 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72  ->pBe==0 ) retur
bfc0: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
bfd0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
bfe0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
bff0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
c000: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
c010: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20  E_InTrans)==0 ) 
c020: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
c030: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
c040: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
c050: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c060: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
c070: 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
c080: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
c090: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
c0a0: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
c0b0: 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
c0c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
c0d0: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
c0e0: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
c0f0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
c100: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
c110: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
c120: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  The operation wi
c130: 6c 6c 20 62 65 20 61 74 6f 6d 69 63 20 69 6e 20  ll be atomic in 
c140: 74 68 65 0a 2a 2a 20 73 65 6e 73 65 20 74 68 61  the.** sense tha
c150: 74 20 69 74 20 77 69 6c 6c 20 65 69 74 68 65 72  t it will either
c160: 20 64 6f 20 69 74 73 20 63 68 61 6e 67 65 73 20   do its changes 
c170: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 72 20 6e 6f  completely or no
c180: 74 20 61 74 0a 2a 2a 20 61 6c 6c 2e 20 20 53 6f  t at.** all.  So
c190: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6e 65   there is not ne
c1a0: 65 64 20 74 6f 20 73 65 74 20 61 20 63 68 65 63  ed to set a chec
c1b0: 6b 70 6f 69 6e 74 20 69 73 20 61 20 74 72 61 6e  kpoint is a tran
c1c0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 6c  saction.** is al
c1d0: 72 65 61 64 79 20 69 6e 20 65 66 66 65 63 74 2e  ready in effect.
c1e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
c1f0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
c200: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
c210: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
c220: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
c230: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
c240: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
c250: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
c260: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
c270: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 20 29  E_InTrans)==0  )
c280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
c290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
c2a0: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
c2b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c2c0: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
c2d0: 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e  Cookie, pParse->
c2e0: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
c2f0: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
c300: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
c310: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
c320: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
c330: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
c340: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
c350: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
c360: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
c370: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
c380: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69  The operation mi
c390: 67 68 74 20 6e 6f 74 20 62 65 20 61 74 6f 6d 69  ght not be atomi
c3a0: 63 20 69 6e 0a 2a 2a 20 74 68 65 20 73 65 6e 73  c in.** the sens
c3b0: 65 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20  e that an error 
c3c0: 6d 61 79 20 62 65 20 64 69 73 63 6f 76 65 72 65  may be discovere
c3d0: 64 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74  d and the operat
c3e0: 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 61 62 6f  ion might.** abo
c3f0: 72 74 20 61 66 74 65 72 20 73 6f 6d 65 20 63 68  rt after some ch
c400: 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
c410: 6d 61 64 65 2e 20 20 49 66 20 77 65 20 61 72 65  made.  If we are
c420: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 0a   in the middle .
c430: 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
c440: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 69 73 20 73  ion, then this s
c450: 65 74 73 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  ets a checkpoint
c460: 2e 20 20 49 66 20 77 65 20 61 72 65 20 6e 6f 74  .  If we are not
c470: 20 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   in.** a transac
c480: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 72 74  tion, then start
c490: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
c4a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65  */.void sqliteBe
c4b0: 67 69 6e 4d 75 6c 74 69 57 72 69 74 65 4f 70 65  ginMultiWriteOpe
c4c0: 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
c4d0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
c4e0: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  ;.  v = sqliteGe
c4f0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c500: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
c510: 72 6e 3b 0a 20 20 69 66 28 20 28 70 50 61 72 73  rn;.  if( (pPars
c520: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
c530: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
c540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
c550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
c560: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
c570: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
c580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
c590: 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73  ifyCookie, pPars
c5a0: 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e->db->schema_co
c5b0: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  okie, 0);.    pP
c5c0: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
c5d0: 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
c5e0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
c5f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65  eAddOp(v, OP_Che
c600: 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a  ckpoint, 0, 0);.
c610: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
c620: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
c630: 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65  concludes an ope
c640: 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ration that may 
c650: 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  have changed.** 
c660: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
c670: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69  his is a compani
c680: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42  on function to B
c690: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
c6a0: 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72  on()..** If a tr
c6b0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
c6c0: 61 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d  arted, then comm
c6d0: 69 74 20 69 74 2e 20 20 49 66 20 61 20 63 68 65  it it.  If a che
c6e0: 63 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73  ckpoint was.** s
c6f0: 74 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d  tarted then comm
c700: 69 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64  it that..*/.void
c710: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
c720: 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
c730: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
c740: 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
c750: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c760: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
c770: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
c780: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
c790: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
c7a0: 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68  {.    /* Do Noth
c7b0: 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ing */.  }else{.
c7c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c7d0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
c7e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
c7f0: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
c800: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
c810: 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g as a boolean v
c820: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
c830: 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63  int getBoolean(c
c840: 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69  har *z){.  stati
c850: 63 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d  c char *azTrue[]
c860: 20 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22   = { "yes", "on"
c870: 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e  , "true" };.  in
c880: 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d  t i;.  if( z[0]=
c890: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c8a0: 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30   if( isdigit(z[0
c8b0: 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27  ]) || (z[0]=='-'
c8c0: 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d   && isdigit(z[1]
c8d0: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
c8e0: 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20   atoi(z);.  }.  
c8f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
c900: 66 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66  f(azTrue)/sizeof
c910: 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b  (azTrue[0]); i++
c920: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
c930: 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75  eStrICmp(z,azTru
c940: 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  e[i])==0 ) retur
c950: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
c960: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
c970: 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73  ocess a pragma s
c980: 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  tatement.  .**.*
c990: 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66  * Pragmas are of
c9a0: 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a   this form:.**.*
c9b0: 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64  *      PRAGMA id
c9c0: 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54   = value.**.** T
c9d0: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69  he identifier mi
c9e0: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74  ght also be a st
c9f0: 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65  ring.  The value
ca00: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e   is a string, an
ca10: 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c  d.** identifier,
ca20: 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49   or a number.  I
ca30: 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74  f minusFlag is t
ca40: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61  rue, then the va
ca50: 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62  lue is.** a numb
ca60: 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63  er that was prec
ca70: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
ca80: 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sign..*/.void sq
ca90: 6c 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65  litePragma(Parse
caa0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
cab0: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
cac0: 52 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73  Right, int minus
cad0: 46 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Flag){.  char *z
cae0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Left = 0;.  char
caf0: 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *zRight = 0;.  
cb00: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
cb10: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66  rse->db;..  zLef
cb20: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
cb30: 70 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66  p(pLeft->z, pLef
cb40: 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  t->n);.  sqliteD
cb50: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
cb60: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
cb70: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30  {.    zRight = 0
cb80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
cb90: 53 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20  String(&zRight, 
cba0: 22 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e  "-", 1, pRight->
cbb0: 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29  z, pRight->n, 0)
cbc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
cbd0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74  Right = sqliteSt
cbe0: 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c  rNDup(pRight->z,
cbf0: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20   pRight->n);.   
cc00: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
cc10: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20  Right);.  }. .  
cc20: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
cc30: 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73  p(zLeft,"cache_s
cc40: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
cc50: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
cc60: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  zRight);.    sql
cc70: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
cc80: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 73 69  Size(db->pBe, si
cc90: 7a 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ze);.  }else..  
cca0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ccb0: 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74  p(zLeft, "vdbe_t
ccc0: 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
ccd0: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
cce0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
ccf0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
cd00: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a  LITE_VdbeTrace;.
cd10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cd20: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
cd30: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
cd40: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
cd50: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
cd60: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c  Cmp(zLeft, "full
cd70: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d  _column_names")=
cd80: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
cd90: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
cda0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
cdb0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75  ags |= SQLITE_Fu
cdc0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  llColNames;.    
cdd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
cde0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
cdf0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
ce00: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
ce10: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
ce20: 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c  mp(zLeft, "resul
ce30: 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d  t_set_details")=
ce40: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
ce50: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
ce60: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
ce70: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65  ags |= SQLITE_Re
ce80: 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
ce90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
cea0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ceb0: 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73  TE_ResultDetails
cec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
ced0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
cee0: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75  ICmp(zLeft, "cou
cef0: 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20  nt_changes")==0 
cf00: 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
cf10: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
cf20: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
cf30: 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74   |= SQLITE_Count
cf40: 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Rows;.    }else{
cf50: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
cf60: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e   &= ~SQLITE_Coun
cf70: 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  tRows;.    }.  }
cf80: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
cf90: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
cfa0: 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63   "empty_result_c
cfb0: 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b  allbacks")==0 ){
cfc0: 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
cfd0: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
cfe0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
cff0: 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c  = SQLITE_NullCal
d000: 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  lback;.    }else
d010: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
d020: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c  s &= ~SQLITE_Nul
d030: 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  lCallback;.    }
d040: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
d050: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
d060: 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f  eft, "table_info
d070: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  ")==0 ){.    Tab
d080: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64  le *pTab;.    Vd
d090: 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20  be *v;.    pTab 
d0a0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
d0b0: 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20  e(db, zRight);. 
d0c0: 20 20 20 69 66 28 20 70 54 61 62 20 29 20 76 20     if( pTab ) v 
d0d0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
d0e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
d0f0: 20 70 54 61 62 20 26 26 20 76 20 29 7b 0a 20 20   pTab && v ){.  
d100: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
d110: 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  p tableInfoPrefa
d120: 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ce[] = {.       
d130: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
d140: 74 2c 20 35 2c 20 30 2c 20 20 20 20 20 20 20 30  t, 5, 0,       0
d150: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
d160: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
d170: 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c  0,       "cid"},
d180: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
d190: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
d1a0: 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
d1b0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
d1c0: 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
d1d0: 20 20 20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20        "type"},. 
d1e0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
d1f0: 6d 6e 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20  mnName,  3, 0,  
d200: 20 20 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c       "notnull"},
d210: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
d220: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c  lumnName,  4, 0,
d230: 20 20 20 20 20 20 20 22 64 66 6c 74 5f 76 61 6c         "dflt_val
d240: 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  ue"},.      };. 
d250: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
d260: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d270: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
d280: 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
d290: 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
d2a0: 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66  reface);.      f
d2b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
d2c0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
d2d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d2e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d2f0: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
d300: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d310: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
d320: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
d330: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
d340: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61  3(v, -1, pTab->a
d350: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33  Col[i].zName, P3
d360: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
d370: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d380: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
d390: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
d3a0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
d3b0: 33 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  3(v, -1, .      
d3c0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
d3d0: 69 5d 2e 7a 54 79 70 65 20 3f 20 70 54 61 62 2d  i].zType ? pTab-
d3e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a  >aCol[i].zType :
d3f0: 20 22 74 65 78 74 22 2c 20 50 33 5f 53 54 41 54   "text", P3_STAT
d400: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
d410: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d420: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
d430: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
d440: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  l, 0);.        s
d450: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d460: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
d470: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
d480: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
d490: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
d4a0: 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54  [i].zDflt, P3_ST
d4b0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
d4c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d4d0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35  , OP_Callback, 5
d4e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d4f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
d500: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
d510: 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 69  (zLeft, "index_i
d520: 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfo")==0 ){.    
d530: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
d540: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
d550: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70    Vdbe *v;.    p
d560: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
d570: 49 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74  Index(db, zRight
d580: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
d590: 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56  ) v = sqliteGetV
d5a0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
d5b0: 20 69 66 28 20 70 49 64 78 20 26 26 20 76 20 29   if( pIdx && v )
d5c0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56  {.      static V
d5d0: 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50  dbeOp tableInfoP
d5e0: 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20  reface[] = {.   
d5f0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
d600: 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20  Count, 3, 0,    
d610: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b     0},.        {
d620: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
d630: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65   0, 0,       "se
d640: 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  qno"},.        {
d650: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
d660: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69   1, 0,       "ci
d670: 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  d"},.        { O
d680: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
d690: 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65  , 0,       "name
d6a0: 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  "},.      };.   
d6b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
d6c0: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
d6d0: 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
d6e0: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
d6f0: 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
d700: 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
d710: 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
d720: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
d730: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
d740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d750: 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d  int cnum = pIdx-
d760: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d780: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
d790: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
d7a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d7b0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d7c0: 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20  r, cnum, 0);.   
d7d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d7e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
d7f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
d800: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
d810: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
d820: 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61  ->aCol[cnum].zNa
d830: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
d840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
d850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
d860: 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20  llback, 3, 0);. 
d870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d880: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
d890: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
d8a0: 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d   "index_list")==
d8b0: 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
d8c0: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
d8d0: 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
d8e0: 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
d8f0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
d900: 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
d910: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
d920: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
d930: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
d940: 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e     pIdx = pTab->
d950: 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
d960: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70 49    if( pTab && pI
d970: 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  dx && v ){.     
d980: 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
d990: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
d9a0: 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63   indexListPrefac
d9b0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
d9c0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
d9d0: 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 3, 0,       0}
d9e0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
d9f0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
da00: 2c 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a  ,       "seq"},.
da10: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
da20: 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
da30: 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
da40: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
da50: 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20  mnName,  2, 0,  
da60: 20 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a       "unique"},.
da70: 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
da80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
da90: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
daa0: 28 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63  (indexListPrefac
dab0: 65 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65  e), indexListPre
dac0: 66 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69  face);.      whi
dad0: 6c 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20  le(pIdx){.      
dae0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
daf0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
db00: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
db10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
db20: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
db30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
db40: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
db50: 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61  v, -1, pIdx->zNa
db60: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
db70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
db80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
db90: 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45  teger, pIdx->onE
dba0: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30  rror!=OE_None, 0
dbb0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dbc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
dbd0: 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29  _Callback, 3, 0)
dbe0: 3b 0a 09 2b 2b 69 3b 0a 09 70 49 64 78 20 3d 20  ;..++i;..pIdx = 
dbf0: 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pIdx->pNext;.   
dc00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
dc10: 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se..#ifndef NDEB
dc20: 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  UG.  if( sqliteS
dc30: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70  trICmp(zLeft, "p
dc40: 61 72 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30  arser_trace")==0
dc50: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76   ){.    extern v
dc60: 6f 69 64 20 73 71 6c 69 74 65 50 61 72 73 65 72  oid sqliteParser
dc70: 54 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61  Trace(FILE*, cha
dc80: 72 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65  r *);.    if( ge
dc90: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
dca0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dcb0: 50 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f  ParserTrace(stdo
dcc0: 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b  ut, "parser: ");
dcd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dce0: 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72    sqliteParserTr
dcf0: 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ace(0, 0);.    }
dd00: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
dd10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
dd20: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74  ICmp(zLeft, "int
dd30: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d  egrity_check")==
dd40: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
dd50: 56 64 62 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d  VdbeOp checkDb[]
dd60: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
dd70: 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20  SetInsert,   0, 
dd80: 30 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a  0,        "2"},.
dd90: 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c        { OP_Open,
dda0: 20 20 20 20 20 20 20 20 30 2c 20 32 2c 20 20 20          0, 2,   
ddb0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ddc0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
ddd0: 20 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d   0, 6,        0}
dde0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
ddf0: 75 6d 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20  umn,      0, 3, 
de00: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
de10: 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c   { OP_SetInsert,
de20: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
de30: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
de40: 65 78 74 2c 20 20 20 20 20 20 20 20 30 2c 20 33  ext,        0, 3
de50: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
de60: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74     { OP_Integrit
de70: 79 43 6b 2c 20 30 2c 20 30 2c 20 20 20 20 20 20  yCk, 0, 0,      
de80: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
de90: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
dea0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
deb0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
dec0: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
ded0: 20 20 20 20 22 73 61 6e 69 74 79 5f 63 68 65 63      "sanity_chec
dee0: 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  k"},.      { OP_
def0: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
df00: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
df10: 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
df20: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
df30: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
df40: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
df50: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
df60: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
df70: 79 53 69 7a 65 28 63 68 65 63 6b 44 62 29 2c 20  ySize(checkDb), 
df80: 63 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73  checkDb);.  }els
df90: 65 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65  e..  {}.  sqlite
dfa0: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73  Free(zLeft);.  s
dfb0: 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74  qliteFree(zRight
dfc0: 29 3b 0a 7d 0a                                   );.}.