/ Hex Artifact Content
Login

Artifact 7ada2426caba70cb1072ba268bedb694b5018065:


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 65 78 70 72 65    creating expre
0290: 73 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69  ssions and ID li
02a0: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02b0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02c0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02d0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02e0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02f0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
0300: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0310: 69 6c 64 2e 63 2c 76 20 31 2e 38 30 20 32 30 30  ild.c,v 1.80 200
0320: 32 2f 30 32 2f 32 37 20 30 31 3a 34 37 3a 31 32  2/02/27 01:47:12
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
0820: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0830: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0840: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0850: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0860: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0870: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0880: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0890: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
08a0: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
08b0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
08c0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
08d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
08e0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c    Table *p = sql
08f0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
0900: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
0910: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
0920: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
0930: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0940: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0950: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0960: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0970: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0980: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0990: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
09a0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
09b0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
09c0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
09d0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
09e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
09f0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73  {.  Index *p = s
0a00: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0a10: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0a20: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0a30: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0a50: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0a60: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0a70: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0a80: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0a90: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0aa0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0ab0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0ac0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0ad0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0ae0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0af0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
0b00: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
0b10: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
0b20: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
0b30: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
0b40: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
0b50: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
0b60: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
0b70: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0b80: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
0b90: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
0ba0: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
0bb0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
0bc0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
0bd0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
0be0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
0bf0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
0c00: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
0c10: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
0c20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
0c30: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c40: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
0c50: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
0c60: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
0c70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
0c80: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c90: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
0ca0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
0cc0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0cd0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
0ce0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
0cf0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
0d00: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d10: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
0d20: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
0d30: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0d40: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
0d50: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
0d60: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
0d70: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
0d80: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
0d90: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
0da0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
0db0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
0dc0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
0dd0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
0de0: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
0df0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
0e00: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
0e10: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
0e20: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
0e30: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
0e40: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
0e50: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
0e60: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
0e70: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
0e80: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
0e90: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
0ea0: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
0eb0: 78 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  x to the pending
0ec0: 20 44 52 4f 50 20 49 4e 44 45 58 20 71 75 65 75   DROP INDEX queu
0ed0: 65 20 69 66 20 69 74 20 68 61 73 0a 2a 2a 20 62  e if it has.** b
0ee0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  een committed.  
0ef0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 77 61  If this index wa
0f00: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
0f10: 64 2c 20 74 68 65 6e 20 6a 75 73 74 0a 2a 2a 20  d, then just.** 
0f20: 64 65 6c 65 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  delete it..**.**
0f30: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
0f40: 70 65 6e 64 69 6e 67 20 64 72 6f 70 20 71 75 65  pending drop que
0f50: 75 65 20 61 72 65 20 64 65 6c 65 74 65 64 20 77  ue are deleted w
0f60: 68 65 6e 20 61 20 43 4f 4d 4d 49 54 20 69 73 0a  hen a COMMIT is.
0f70: 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  ** executed.  If
0f80: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75   a ROLLBACK occu
0f90: 72 73 2c 20 74 68 65 20 69 6e 64 69 63 65 73 20  rs, the indices 
0fa0: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
0fb0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  nto.** the main 
0fc0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fe0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
0ff0: 6f 70 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  opIndex(sqlite *
1000: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1010: 20 69 66 28 20 21 70 2d 3e 69 73 43 6f 6d 6d 69   if( !p->isCommi
1020: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  t ){.    sqliteU
1030: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1040: 64 65 78 28 64 62 2c 20 70 29 3b 0a 20 20 7d 65  dex(db, p);.  }e
1050: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1060: 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  pOld;.    pOld =
1070: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1080: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
1090: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
10a0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
10b0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
10c0: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
10d0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
10e0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10f0: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
1100: 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a  , strlen(pOld->z
1110: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
1120: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1130: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1140: 69 64 78 44 72 6f 70 2c 20 70 2c 20 30 2c 20 70  idxDrop, p, 0, p
1150: 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 72 6f 70  );.    p->isDrop
1160: 70 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ped = 1;.  }.}..
1170: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1180: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1190: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
11a0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
11b0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
11c0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11d0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
11e0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
11f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
1200: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
1210: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
1220: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
1230: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
1240: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1250: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1260: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
1270: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1280: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1290: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
12a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12b0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
12c0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
12d0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
12e0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
12f0: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
1300: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
1310: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
1320: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
1330: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
1340: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
1350: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
1360: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
1370: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
1380: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
1390: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  id sqliteDeleteT
13a0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
13b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
13c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65  .  int i;.  Inde
13d0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
13e0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  t;.  if( pTable=
13f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1400: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
1410: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1420: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1430: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
1440: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
1450: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1460: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
1470: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1480: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
1490: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e  );.  }.  for(pIn
14a0: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
14b0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
14c0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
14d0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
14e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
14f0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1500: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
1510: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1520: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
1530: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1540: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
1550: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
1560: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
1570: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1580: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
1590: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
15a0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
15b0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
15c0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
15d0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
15e0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
15f0: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
1600: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1610: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
1620: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
1630: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
1640: 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  pOld;.  assert( 
1650: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1660: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1670: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1680: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1690: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
16a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
16b0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
16c0: 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49  );.  sqliteHashI
16d0: 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44 72  nsert(&db->tblDr
16e0: 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  op, p, 0, 0);.  
16f0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
1700: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1710: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69 76 65  ** Move the give
1720: 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 70  n table to the p
1730: 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41 42 4c  ending DROP TABL
1740: 45 20 71 75 65 75 65 20 69 66 20 69 74 20 68 61  E queue if it ha
1750: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d 69 74  s.** been commit
1760: 74 65 64 2e 20 20 49 66 20 74 68 69 73 20 74 61  ted.  If this ta
1770: 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f  ble was never co
1780: 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6a 75  mmitted, then ju
1790: 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69 74 2e  st.** delete it.
17a0: 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20 66 6f    Do the same fo
17b0: 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  r all its indice
17c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f  s..**.** Table o
17d0: 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65 75 65  n the drop queue
17e0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
17f0: 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69 6c 20  y deleted until 
1800: 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74 61 74  a COMMIT.** stat
1810: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
1820: 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42 41 43  d.  If a ROLLBAC
1830: 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65 61 64  K occurs instead
1840: 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a 2a 2a   of a COMMIT,.**
1850: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   then the tables
1860: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1870: 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63  ue are moved bac
1880: 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a  k into the main.
1890: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ** hash table..*
18a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18b0: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 54  litePendingDropT
18c0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
18d0: 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b 0a 20   Table *pTbl){. 
18e0: 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73 43 6f   if( !pTbl->isCo
18f0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
1900: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1910: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62 6c 29  eTable(db, pTbl)
1920: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
1930: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
1940: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
1950: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c 64 20  pNext;.    pOld 
1960: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1970: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1980: 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74   pTbl->zName, st
1990: 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61 6d 65  rlen(pTbl->zName
19a0: 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73 73 65  )+1,0);.    asse
19b0: 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c 20 29  rt( pOld==pTbl )
19c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
19d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44  Insert(&db->tblD
19e0: 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20 70 54  rop, pTbl, 0, pT
19f0: 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  bl);.    for(pIn
1a00: 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49 6e 64  dex = pTbl->pInd
1a10: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a20: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  ex=pNext){.     
1a30: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
1a40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a50: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
1a60: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1a70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a80: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54  *.** Check all T
1a90: 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65  ables and Indexe
1aa0: 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  s in the interna
1ab0: 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  l hash table and
1ac0: 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61   commit.** any a
1ad0: 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65  dditions or dele
1ae0: 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68  tions to those h
1af0: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ash tables..**.*
1b00: 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67  * When executing
1b10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e   CREATE TABLE an
1b20: 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  d CREATE INDEX s
1b30: 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54  tatements, the T
1b40: 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65  able.** and Inde
1b50: 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65  x structures are
1b60: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
1b70: 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ed to the hash t
1b80: 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68  ables, but.** th
1b90: 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65  e "isCommit" fie
1ba0: 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20  ld is not set.  
1bb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1bc0: 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  s those fields..
1bd0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1be0: 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64  g DROP TABLE and
1bf0: 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65   DROP INDEX, the
1c00: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1c10: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1c20: 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66 20 74  e moved out of t
1c30: 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78 48 61  blHash and idxHa
1c40: 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f 70 20  sh into tblDrop 
1c50: 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20 54 68  and idxDrop.  Th
1c60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 65  is.** routine de
1c70: 6c 65 74 65 73 20 74 68 65 20 73 74 72 75 63 74  letes the struct
1c80: 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70 20 61  ure in tblDrop a
1c90: 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a 0a 2a  nd idxDrop..**.*
1ca0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
1cb0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1cc0: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
1cd0: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1ce0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1cf0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48  sqlite *db){.  H
1d00: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
1d10: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
1d20: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
1d30: 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20 72 65  Changes)==0 ) re
1d40: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63 68 65  turn;.  db->sche
1d50: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1d60: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1d70: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1d80: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1d90: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1da0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1db0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1dc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1dd0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1de0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 61 62  pElem);.    pTab
1df0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  le->isCommit = 1
1e00: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  ;.  }.  for(pEle
1e10: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1e20: 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70 29 3b  t(&db->tblDrop);
1e30: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e40: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e50: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1e60: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1e70: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1e80: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1e90: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
1ea0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1eb0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 74  HashClear(&db->t
1ec0: 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72 28 70  blDrop);.  for(p
1ed0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1ee0: 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61 73  irst(&db->idxHas
1ef0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
1f00: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1f10: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1f20: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1f30: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1f40: 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  m);.    pIndex->
1f50: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1f60: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45 6c 65  }.  while( (pEle
1f70: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f80: 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29 29  t(&db->idxDrop))
1f90: 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  !=0 ){.    Index
1fa0: 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74   *pIndex = sqlit
1fb0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1fc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  ;.    sqliteUnli
1fd0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1fe0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1ff0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
2000: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
2010: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2020: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2030: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2040: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2050: 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20  uns when one or 
2060: 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42 4c  more CREATE TABL
2070: 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58 2c  E, CREATE INDEX,
2080: 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c 20  .** DROP TABLE, 
2090: 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  or DROP INDEX st
20a0: 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72 6f  atements gets ro
20b0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65 0a  lled back.  The.
20c0: 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20  ** additions or 
20d0: 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61 62  deletions of Tab
20e0: 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72  le and Index str
20f0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a 2a  uctures in the.*
2100: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
2110: 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f 6e  tables are undon
2120: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
2130: 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  o: sqliteCommitI
2140: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29  nternalChanges()
2150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
2160: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2170: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2180: 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65 6c  b){.  Hash toDel
2190: 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  ete;.  HashElem 
21a0: 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28 64  *pElem;.  if( (d
21b0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
21c0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
21d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
21e0: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
21f0: 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54 45  toDelete, SQLITE
2200: 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20 30  _HASH_POINTER, 0
2210: 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  );.  db->next_co
2220: 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d  okie = db->schem
2230: 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72 28  a_cookie;.  for(
2240: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2250: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
2260: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
2270: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2280: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
2290: 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71  ble *pTable = sq
22a0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
22b0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  em);.    if( !pT
22c0: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  able->isCommit )
22d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
22e0: 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65  shInsert(&toDele
22f0: 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20 70  te, pTable, 0, p
2300: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
2310: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
2320: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2330: 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d 3b  oDelete); pElem;
2340: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2350: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2360: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2370: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2380: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
2390: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
23a0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
23b0: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
23c0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f 44  teHashClear(&toD
23d0: 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70 45  elete);.  for(pE
23e0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23f0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
2400: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2410: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2420: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
2430: 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73 71  e *pOld, *p = sq
2440: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2450: 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
2460: 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   p->isCommit );.
2470: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2480: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2490: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
24a0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
24b0: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
24c0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
24d0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
24e0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
24f0: 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  ear(&db->tblDrop
2500: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2510: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2520: 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  db->idxHash); pE
2530: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2540: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2550: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
2560: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61 73  ndex = sqliteHas
2570: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2580: 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 69    if( !pIndex->i
2590: 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  sCommit ){.     
25a0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
25b0: 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49 6e  t(&toDelete, pIn
25c0: 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29 3b  dex, 0, pIndex);
25d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
25e0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
25f0: 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65  hFirst(&toDelete
2600: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2610: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2620: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
2630: 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  x *pIndex = sqli
2640: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2650: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  );.    sqliteUnl
2660: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2670: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
2680: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2690: 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b  lear(&toDelete);
26a0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
26b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
26c0: 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c 65  ->idxDrop); pEle
26d0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
26e0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
26f0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  .    Index *pOld
2700: 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73  , *p = sqliteHas
2710: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2720: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 43    assert( p->isC
2730: 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d 3e  ommit );.    p->
2740: 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a 20  isDropped = 0;. 
2750: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
2760: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2770: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2780: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2790: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 61  me)+1, p);.    a
27a0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
27b0: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 7d  | pOld==p );.  }
27c0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
27d0: 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29  ar(&db->idxDrop)
27e0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
27f0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2800: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2810: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e   Construct the n
2820: 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61  ame of a user ta
2830: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f  ble or index fro
2840: 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  m a token..**.**
2850: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2860: 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  he name is obtai
2870: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
2880: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
2890: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
28a0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
28b0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
28c0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
28d0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
28e0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
28f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
2900: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
2910: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
2920: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
2930: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
2950: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
2960: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
2970: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
2980: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
2990: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
29a0: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
29b0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
29c0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
29d0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
29e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
29f0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
2a00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a10: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
2a20: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
2a30: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
2a40: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
2a50: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
2a60: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
2a70: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
2a80: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
2a90: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
2aa0: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
2ab0: 72 75 65 20 69 66 20 74 68 65 20 22 54 45 4d 50  rue if the "TEMP
2ac0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
2ad0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
2ae0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
2af0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
2b00: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
2b10: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
2b20: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
2b30: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
2b40: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
2b50: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
2b60: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2b70: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
2b80: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
2b90: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
2ba0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
2bb0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2bc0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
2bd0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
2be0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
2bf0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
2c00: 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  e sqliteEndTable
2c10: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
2c20: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
2c30: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
2c40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
2c50: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
2c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72  .void sqliteStar
2c70: 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  tTable(Parse *pP
2c80: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74  arse, Token *pSt
2c90: 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  art, Token *pNam
2ca0: 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  e, int isTemp){.
2cb0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
2cc0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2cd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2ce0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
2cf0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
2d00: 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e   *v;..  pParse->
2d10: 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70  sFirstToken = *p
2d20: 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d  Start;.  zName =
2d30: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
2d40: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
2d50: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
2d60: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
2d70: 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   Before trying t
2d80: 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f  o create a tempo
2d90: 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65  rary table, make
2da0: 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20   sure the Btree 
2db0: 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67  for.  ** holding
2dc0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2dd0: 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  s is open..  */.
2de0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
2df0: 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29  db->pBeTemp==0 )
2e00: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2e10: 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30  qliteBtreeOpen(0
2e20: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
2e30: 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20  &db->pBeTemp);. 
2e40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2e60: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2e70: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2e80: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
2e90: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
2ea0: 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
2eb0: 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
2ec0: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
2ed0: 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  es", 0);.      p
2ee0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
2ef0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2f00: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
2f10: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f20: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
2f30: 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42  c = sqliteBtreeB
2f40: 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42  eginTrans(db->pB
2f50: 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  eTemp);.      if
2f60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f80: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2f90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
2fa0: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
2fb0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
2fc0: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
2fd0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
2fe0: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
2ff0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3000: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3010: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3020: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3030: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3040: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3050: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3060: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3070: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3080: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3090: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
30a0: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
30b0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
30c0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
30d0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
30e0: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
30f0: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
3100: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3110: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3120: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3130: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3140: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3150: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3160: 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e 65  en ignore the ne
3170: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
3180: 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  e..  ** We will 
3190: 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67  continue parsing
31a0: 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73 65  , but the pParse
31b0: 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61 67  ->nameClash flag
31c0: 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a   will be set.  *
31d0: 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  * so we will kno
31e0: 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68 65  w to discard the
31f0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e   table record on
3200: 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20 66  ce parsing has f
3210: 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  inished..  */.  
3220: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
3230: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
3240: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
3250: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e!=0 ){.    if( 
3260: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26  pTable->isTemp &
3270: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
3280: 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ag ){.      pPar
3290: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
32a0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
32b0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
32c0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
32d0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
32e0: 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e   0, pName->z, pN
32f0: 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20  ame->n,.        
3300: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
3310: 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ts", 0, 0);.    
3320: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3330: 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
3340: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3350: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
3370: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3380: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  0;.  }.  if( (pI
3390: 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  dx = sqliteFindI
33a0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29  ndex(db, zName))
33b0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
33c0: 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   (!pIdx->pTable-
33d0: 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72  >isTemp || !pPar
33e0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
33f0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
3400: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3410: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
3420: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3430: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
3440: 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20     zName, 0);.  
3450: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3460: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
3470: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
3480: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3490: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
34a0: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
34b0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
34c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
34d0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
34e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
34f0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
3500: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
3510: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3520: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3530: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3540: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3550: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3560: 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73 54  le->isTemp = isT
3570: 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73  emp;.  if( pPars
3580: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
3590: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
35a0: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
35b0: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
35c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
35d0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
35e0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
35f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
3600: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
3610: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
3620: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
3630: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
3640: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
3650: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
3660: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
3670: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
3680: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
3690: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
36a0: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
36b0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
36c0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
36d0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
36e0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
36f0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
3700: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
3710: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
3720: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
3730: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
3740: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
3750: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
3760: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3770: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
3780: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
3790: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
37a0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
37b0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74  & (v = sqliteGet
37c0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
37d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65   ){.    sqliteBe
37e0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
37f0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  n(pParse);.    i
3800: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3810: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3820: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
3830: 6b 69 65 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  kie, db->file_fo
3840: 72 6d 61 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rmat, 1);.      
3850: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3860: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
3870: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
3880: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
3890: 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e  (v, -1, MASTER_N
38a0: 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  AME, P3_STATIC);
38b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
38c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
38d0: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
38e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
38f0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
3900: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3910: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3920: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3940: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3950: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
3960: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3970: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
3980: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
3990: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
39a0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
39b0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
39c0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
39d0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
39e0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
39f0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
3a00: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3a10: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3a20: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3a30: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3a40: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3a50: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
3a60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
3a70: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
3a80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
3a90: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
3aa0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3ab0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3ac0: 70 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  p;.  char **pz;.
3ad0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3ae0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3b00: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
3b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
3b20: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
3b30: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
3b40: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
3b50: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
3b60: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
3b70: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
3b80: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
3b90: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
3ba0: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 6f 6c   memset(&p->aCol
3bb0: 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69  [p->nCol], 0, si
3bc0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
3bd0: 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  );.  pz = &p->aC
3be0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e  ol[p->nCol++].zN
3bf0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  ame;.  sqliteSet
3c00: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e 61 6d  NString(pz, pNam
3c10: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3c20: 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  0);.  sqliteDequ
3c30: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
3c40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3c50: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
3c60: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
3c70: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
3c80: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
3c90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3ca0: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
3cb0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
3cc0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
3cd0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
3ce0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
3cf0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
3d00: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
3d10: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
3d20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
3d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e  .void sqliteAddN
3d40: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
3d50: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
3d60: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
3d70: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
3d80: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
3d90: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
3da0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
3db0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
3dc0: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
3dd0: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
3de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3df0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3e00: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
3e10: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
3e20: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
3e30: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
3e40: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
3e50: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
3e60: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
3e70: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
3e80: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
3e90: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
3ea0: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
3eb0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
3ec0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3ed0: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
3ee0: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
3ef0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
3f00: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
3f10: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
3f20: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
3f30: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3f40: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
3f50: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
3f60: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
3f70: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
3f80: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
3f90: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
3fa0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46  Parse, Token *pF
3fb0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61  irst, Token *pLa
3fc0: 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  st){.  Table *p;
3fd0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
3fe0: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c  nt n;.  char *z,
3ff0: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
4000: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4010: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4020: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4030: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4040: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4050: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b  ->aCol[i].zType;
4060: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
4070: 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29  + Addr(pLast->z)
4080: 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e   - Addr(pFirst->
4090: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e  z);.  sqliteSetN
40a0: 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73  String(pz, pFirs
40b0: 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a  t->z, n, 0);.  z
40c0: 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d   = *pz;.  if( z=
40d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
40e0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
40f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
4100: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
4110: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
4120: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
4130: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
4140: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
4150: 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20  The given token 
4160: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
4170: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73  alue for the las
4180: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
4190: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63  o.** the table c
41a0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
41b0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  onstruction.  If
41c0: 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20   "minusFlag" is 
41d0: 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  true, it.** mean
41e0: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65  s the value toke
41f0: 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  n was preceded b
4200: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
4210: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4220: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4230: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4240: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4250: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4260: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4270: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
4280: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
4290: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
42a0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
42b0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
42c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
42d0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70  nt i;.  char **p
42e0: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
42f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4300: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4310: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4320: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
4330: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
4340: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69  ol[i].zDflt;.  i
4350: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
4360: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4370: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
4380: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
4390: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
43a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
43b0: 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a  ring(pz, pVal->z
43c0: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
43d0: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f   }.  sqliteDequo
43e0: 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  te(*pz);.}../*.*
43f0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
4400: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
4410: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
4420: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
4430: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
4440: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
4450: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
4460: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
4470: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
4480: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
4490: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
44a0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
44b0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
44c0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
44d0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
44e0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
44f0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
4500: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
4510: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
4520: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
4530: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
4540: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
4550: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
4560: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
4570: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
4580: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
4590: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
45a0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
45b0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
45c0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69  umn as the row i
45d0: 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a  d.  (Exception:.
45e0: 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  ** For backwards
45f0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
4600: 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61  ith older databa
4610: 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  ses, do not do t
4620: 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  his.** if the fi
4630: 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  le format versio
4640: 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  n number is less
4650: 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74   than 1.)  Set t
4660: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
4670: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
4680: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4690: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
46a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
46b0: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
46c0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
46d0: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
46e0: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
46f0: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
4700: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
4710: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
4720: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
4730: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
4740: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
4750: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
4760: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
4770: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
4780: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
4790: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
47a0: 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72   sqliteAddPrimar
47b0: 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  yKey(Parse *pPar
47c0: 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  se, IdList *pLis
47d0: 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  t, int onError){
47e0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
47f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4800: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
4810: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
4820: 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  l = -1;.  if( pT
4830: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
4840: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
4850: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
4860: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4870: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4880: 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62  "table \"", pTab
4890: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
48a0: 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74    "\" has more t
48b0: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
48c0: 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  key", 0);.    pP
48d0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
48e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
48f0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
4900: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
4910: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
4920: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
4930: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
4940: 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a  List->nId==1 ){.
4950: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
4960: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
4970: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
4980: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
4990: 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e  p(pList->a[0].zN
49a0: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
49b0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
49c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
49d0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
49e0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
49f0: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
4a00: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
4a10: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
4a20: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4a30: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20  >file_format>=1 
4a40: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  && .           z
4a50: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74  Type && sqliteSt
4a60: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
4a70: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
4a80: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
4a90: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
4aa0: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
4ab0: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
4ac0: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
4ad0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
4ae0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
4af0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
4b00: 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68  .** Come up with
4b10: 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61   a new random va
4b20: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63 68 65  lue for the sche
4b30: 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65  ma cookie.  Make
4b40: 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77   sure.** the new
4b50: 20 76 61 6c 75 65 20 69 73 20 64 69 66 66 65 72   value is differ
4b60: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64  ent from the old
4b70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
4b80: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
4b90: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
4ba0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
4bb0: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
4bc0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
4bd0: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
4be0: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
4bf0: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
4c00: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
4c10: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
4c20: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
4c30: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
4c40: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
4c50: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
4c60: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
4c70: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
4c80: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
4c90: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
4ca0: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
4cb0: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
4cc0: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
4cd0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
4ce0: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
4cf0: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
4d00: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
4d10: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
4d20: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
4d30: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
4d40: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
4d50: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
4d60: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
4d70: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
4d80: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
4d90: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
4da0: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
4db0: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
4dc0: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
4dd0: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
4de0: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
4df0: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
4e00: 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
4e10: 6f 69 64 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65  oid changeCookie
4e20: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
4e30: 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  if( db->next_coo
4e40: 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61 5f  kie==db->schema_
4e50: 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64 62  cookie ){.    db
4e60: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20  ->next_cookie = 
4e70: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
4e80: 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  e + sqliteRandom
4e90: 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20  Byte() + 1;.    
4ea0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4eb0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4ec0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
4ed0: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
4ee0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
4ef0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
4f00: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
4f10: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
4f20: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
4f30: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
4f40: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
4f50: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
4f60: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
4f70: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
4f80: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
4f90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
4fa0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
4fb0: 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20  eedQuote = 0;.  
4fc0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
4fd0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
4fe0: 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b  *z=='\'' ){ n++;
4ff0: 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a   needQuote=1; }.
5000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
5010: 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a   needQuote*2;.}.
5020: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5030: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
5040: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
5050: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
5060: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
5070: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
5080: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5090: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
50a0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
50b0: 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e  r *zIdent){.  in
50c0: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
50d0: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
50e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
50f0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
5100: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
5110: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
5120: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
5130: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
5140: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
5150: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
5160: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
5170: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
5180: 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65 28  liteKeywordCode(
5190: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
51a0: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
51b0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  te ) z[i++] = '\
51c0: 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  '';.  for(j=0; z
51d0: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
51e0: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
51f0: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
5200: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20  zIdent[j]=='\'' 
5210: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
5220: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
5230: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
5240: 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30  '\'';.  z[i] = 0
5250: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
5260: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5270: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5280: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
5290: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
52a0: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
52b0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
52c0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
52d0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
52e0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
52f0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
5300: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
5310: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
5320: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5330: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
5340: 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b  eStmt(Table *p){
5350: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
5360: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
5370: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
5380: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20  ep2, *zEnd;.  n 
5390: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
53a0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
53b0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
53c0: 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d  ength(p->aCol[i]
53d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  .zName);.  }.  n
53e0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
53f0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
5400: 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<40 ){.    zSe
5410: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
5420: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
5430: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
5440: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
5450: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
5460: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
5470: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
5480: 20 20 6e 20 2b 3d 20 32 35 20 2b 20 36 2a 70 2d    n += 25 + 6*p-
5490: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
54a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
54b0: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
54c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
54d0: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 54   assert( !p->isT
54e0: 65 6d 70 20 29 3b 0a 20 20 73 74 72 63 70 79 28  emp );.  strcpy(
54f0: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
5500: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
5510: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
5520: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
5530: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
5540: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
5550: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ';.  for(i=0; i<
5560: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
5570: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
5580: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
5590: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
55a0: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
55b0: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
55c0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
55d0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
55e0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  me);.  }.  strcp
55f0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
5600: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
5610: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
5620: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5630: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
5640: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
5650: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
5660: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5670: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
5680: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
5690: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
56a0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
56b0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
56c0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
56d0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
56e0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
56f0: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
5700: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
5710: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
5720: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
5730: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
5740: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
5750: 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20  .** unless this 
5760: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
5770: 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67  able or initFlag
5780: 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46  ==1.  When initF
5790: 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65  lag==1,.** it me
57a0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
57b0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
57c0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
57d0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
57e0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
57f0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
5800: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
5810: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
5820: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
5830: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
5840: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
5850: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
5860: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
5870: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
5880: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
5890: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
58a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
58b0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
58c0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
58d0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
58e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
58f0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
5900: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
5910: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
5920: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
5930: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
5940: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
5950: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
5960: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
5970: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
5980: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
5990: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
59a0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
59b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
59c0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
59d0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
59e0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
59f0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
5a00: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
5a10: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
5a20: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
5a30: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
5a40: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
5a50: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
5a60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
5a70: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5a80: 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  n;..  /* Add the
5a90: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
5aa0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
5ab0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
5ac0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
5ad0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
5ae0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20 70  ameClash==0 || p
5af0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d  Parse->initFlag=
5b00: 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =1 );.  if( pPar
5b10: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26  se->explain==0 &
5b20: 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  & pParse->nameCl
5b30: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  ash==0 ){.    Ta
5b40: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  ble *pOld;.    p
5b50: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
5b60: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
5b70: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
5b80: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
5b90: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
5ba0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
5bb0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
5bc0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
5bd0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
5be0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
5bf0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
5c00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
5c10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
5c20: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
5c30: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
5c40: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5c50: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
5c60: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
5c70: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
5c80: 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68  rom a SELECT, th
5c90: 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  en construct the
5ca0: 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f  .  ** list of co
5cb0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65  lumns and the te
5cc0: 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  xt of the table.
5cd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  .  */.  if( pSel
5ce0: 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ect ){.    Table
5cf0: 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69   *pSelTab = sqli
5d00: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
5d10: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
5d20: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
5d30: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
5d40: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
5d50: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
5d60: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
5d70: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
5d80: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
5d90: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
5da0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
5db0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
5dc0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
5dd0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
5de0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a   pSelTab);.  }..
5df0: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
5e00: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
5e10: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
5e20: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
5e30: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
5e40: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
5e50: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
5e60: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
5e70: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
5e80: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
5e90: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
5ea0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
5eb0: 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70 50  rom the .  ** pP
5ec0: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
5ed0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
5ee0: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68 61  number should ha
5ef0: 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a 2a  ve been put.  **
5f00: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
5f10: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
5f20: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
5f30: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
5f40: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
5f50: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
5f60: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
5f70: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
5f80: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
5f90: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
5fa0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
5fb0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5fc0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
5fd0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
5fe0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
5ff0: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
6000: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
6010: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
6020: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
6030: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
6040: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
6050: 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65 61  , then just crea
6060: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20 44  te the table.  D
6070: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65 20  o not.  ** make 
6080: 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c 49  an entry in SQLI
6090: 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a  TE_MASTER..  */.
60a0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
60b0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
60c0: 6e 74 20 6e 2c 20 61 64 64 72 3b 0a 20 20 20 20  nt n, addr;.    
60d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20  Vdbe *v;..    v 
60e0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
60f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
6100: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
6110: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
6120: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6130: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c  _CreateTable, 0,
6140: 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20   p->isTemp);.   
6150: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6160: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
6170: 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50  ar *)&p->tnum, P
6180: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
6190: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  p->tnum = 0;.   
61a0: 20 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20   if( !p->isTemp 
61b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
61c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
61d0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
61e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
61f0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6200: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
6210: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6220: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
6230: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6240: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6250: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6260: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
6270: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6280: 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  v, -1, p->zName,
6290: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
62a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
62b0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
62c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
62d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
62e0: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
62f0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
6300: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6310: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34  dOp(v, OP_Dup, 4
6320: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6330: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6340: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6350: 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
6360: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ct ){.        ch
6370: 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61  ar *z = createTa
6380: 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  bleStmt(p);.    
6390: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
63a0: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
63b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
63c0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20  ngeP3(v, -1, z, 
63d0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
63e0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
63f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6400: 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20  assert( pEnd!=0 
6410: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41  );.        n = A
6420: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
6430: 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72  ddr(pParse->sFir
6440: 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  stToken.z) + 1;.
6450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6460: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6470: 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  , pParse->sFirst
6480: 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20  Token.z, n);.   
6490: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
64a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
64b0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
64c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
64d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
64e0: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
64f0: 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f  ;.      changeCo
6500: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20  okie(db);.      
6510: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6520: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6530: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
6540: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6550: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6560: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6570: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
6580: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 69  elect ){.      i
6590: 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54 65 6d  nt op = p->isTem
65a0: 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  p ? OP_OpenWrAux
65b0: 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   : OP_OpenWrite;
65c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
65d0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
65e0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
65f0: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
6600: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
6610: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
6620: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
6630: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6640: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
6650: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d  n(pParse);.  }.}
6660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
6670: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6680: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
6690: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
66a0: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
66b0: 74 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  teCreateView(.  
66c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
66d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
66e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
66f0: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
6700: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
6710: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
6720: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
6730: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6740: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e,      /* The t
6750: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
6760: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6770: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
6780: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 2f 2a 20   *pSelect    /* 
6790: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
67a0: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
67b0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
67c0: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73   */.){.  Token s
67d0: 45 6e 64 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53  End;.  Table *pS
67e0: 65 6c 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  elTab;.  Table *
67f0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
6800: 69 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b 0a 0a  int n, offset;..
6810: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
6820: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
6830: 6e 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  n, pName, 0);.  
6840: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
6850: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
6860: 30 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  0 ) goto create_
6870: 76 69 65 77 5f 66 61 69 6c 65 64 3b 0a 20 20 70  view_failed;.  p
6880: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
6890: 65 63 74 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d  ect;.  pSelTab =
68a0: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
68b0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
68c0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
68d0: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
68e0: 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
68f0: 77 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  w_failed;.  asse
6900: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
6910: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53  ;.  p->nCol = pS
6920: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70  elTab->nCol;.  p
6930: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
6940: 2d 3e 61 43 6f 6c 3b 0a 20 20 70 53 65 6c 54 61  ->aCol;.  pSelTa
6950: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  b->nCol = 0;.  p
6960: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
6970: 3b 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  ;.  sqliteDelete
6980: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
6990: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
69a0: 74 55 6e 62 69 6e 64 28 70 53 65 6c 65 63 74 29  tUnbind(pSelect)
69b0: 3b 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  ;.  sEnd = pPars
69c0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
69d0: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
69e0: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
69f0: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
6a00: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
6a10: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
6a20: 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e   n = ((int)sEnd.
6a30: 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e  z) - (int)pBegin
6a40: 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 2d 3e 70 53  ->z;.  z = p->pS
6a50: 65 6c 65 63 74 2d 3e 7a 53 65 6c 65 63 74 20 3d  elect->zSelect =
6a60: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
6a70: 42 65 67 69 6e 2d 3e 7a 2c 20 6e 2b 31 29 3b 0a  Begin->z, n+1);.
6a80: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 67 6f 74    if( z==0 ) got
6a90: 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
6aa0: 69 6c 65 64 3b 0a 20 20 6f 66 66 73 65 74 20 3d  iled;.  offset =
6ab0: 20 28 28 69 6e 74 29 7a 29 20 2d 20 28 69 6e 74   ((int)z) - (int
6ac0: 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 73 71  )pBegin->z;.  sq
6ad0: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
6ae0: 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74  rings(p->pSelect
6af0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 73 71 6c  , offset);.  sql
6b00: 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72  iteEndTable(pPar
6b10: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
6b20: 20 72 65 74 75 72 6e 3b 0a 0a 63 72 65 61 74 65   return;..create
6b30: 5f 76 69 65 77 5f 66 61 69 6c 65 64 3a 0a 20 20  _view_failed:.  
6b40: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
6b50: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  te(pSelect);.  r
6b60: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6b70: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c  Given a token, l
6b80: 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77  ook up a table w
6b90: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20  ith that name.  
6ba0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65  If not found, le
6bb0: 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ave.** an error 
6bc0: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74  for the parser t
6bd0: 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72  o find and retur
6be0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65  n NULL..*/.Table
6bf0: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f   *sqliteTableFro
6c00: 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  mToken(Parse *pP
6c10: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
6c20: 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  k){.  char *zNam
6c30: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
6c40: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
6c50: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
6c60: 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66  oken(pTok);.  if
6c70: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
6c80: 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  urn 0;.  pTab = 
6c90: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
6ca0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
6cb0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
6cc0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
6cd0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
6ce0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
6cf0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
6d00: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
6d10: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
6d20: 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e  pTok->z, pTok->n
6d30: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
6d40: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
6d50: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
6d60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6d70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
6d80: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
6d90: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
6da0: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
6db0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
6dc0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
6dd0: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
6de0: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
6df0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6e00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
6e10: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
6e20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6e30: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a  base;.  sqlite *
6e40: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6e50: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
6e60: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
6e70: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
6e80: 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20  eturn;.  pTable 
6e90: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f  = sqliteTableFro
6ea0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  mToken(pParse, p
6eb0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
6ec0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
6ed0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72  .  if( pTable->r
6ee0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
6ef0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
6f00: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
6f10: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c   "table ", pTabl
6f20: 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  e->zName, .     
6f30: 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64    " may not be d
6f40: 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
6f50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6f60: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6f70: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
6f80: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
6f90: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
6fa0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
6fb0: 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
6fc0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
6fd0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6fe0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
6ff0: 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70  atic VdbeOp drop
7000: 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  Table[] = {.    
7010: 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65    { OP_OpenWrite
7020: 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20  ,  0, 2,        
7030: 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20  MASTER_NAME},.  
7040: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
7050: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
7060: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7070: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
7080: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7090: 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   2 */.      { OP
70a0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
70b0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
70c0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
70d0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
70e0: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
70f0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
7100: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
7110: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7120: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
7130: 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(8),  0},.  
7140: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
7150: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7160: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7170: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
7180: 41 44 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(4),  0}, /*
7190: 20 38 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   8 */.      { OP
71a0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  _SetCookie,  0, 
71b0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
71c0: 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   9 */.      { OP
71d0: 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20  _Close,      0, 
71e0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
71f0: 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a    };.    Index *
7200: 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65  pIdx;.    sqlite
7210: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
7220: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
7230: 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 73   if( !pTable->is
7240: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61  Temp ){.      ba
7250: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
7260: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
7270: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
7280: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
7290: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
72a0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32  angeP3(v, base+2
72b0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
72c0: 20 30 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67   0);.      chang
72d0: 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20  eCookie(db);.   
72e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
72f0: 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 39 2c  ngeP1(v, base+9,
7300: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
7310: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7320: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7330: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62  OP_Destroy, pTab
7340: 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65  le->tnum, pTable
7350: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 66  ->isTemp);.    f
7360: 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e  or(pIdx=pTable->
7370: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
7380: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
7390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
73a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
73b0: 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  troy, pIdx->tnum
73c0: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
73d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
73e0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
73f0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
7400: 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65  }..  /* Move the
7410: 20 74 61 62 6c 65 20 28 61 6e 64 20 61 6c 6c 20   table (and all 
7420: 69 74 73 20 69 6e 64 69 63 65 73 29 20 74 6f 20  its indices) to 
7430: 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50  the pending DROP
7440: 20 71 75 65 75 65 2e 0a 20 20 2a 2a 20 4f 72 2c   queue..  ** Or,
7450: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 77 61   if the table wa
7460: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
7470: 64 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20 69  d, just delete i
7480: 74 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  t.  If the table
7490: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  .  ** has been c
74a0: 6f 6d 6d 69 74 74 65 64 20 61 6e 64 20 69 73 20  ommitted and is 
74b0: 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 70 65  placed on the pe
74c0: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
74d0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
74e0: 64 65 6c 65 74 65 20 77 69 6c 6c 20 6f 63 63 75  delete will occu
74f0: 72 20 77 68 65 6e 20 73 71 6c 69 74 65 43 6f 6d  r when sqliteCom
7500: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
7510: 65 73 28 29 20 65 78 65 63 75 74 65 73 2e 0a 20  es() executes.. 
7520: 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
7530: 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73  on: if the SQL s
7540: 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77  tatement began w
7550: 69 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20  ith the EXPLAIN 
7560: 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68  keyword,.  ** th
7570: 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68  en no changes sh
7580: 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20  ould be made..  
7590: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
75a0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
75b0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
75c0: 6f 70 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  opTable(db, pTab
75d0: 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  le);.    db->fla
75e0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
75f0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
7600: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
7610: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
7620: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
7630: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
7640: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
7650: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
7660: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7670: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
7680: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
7690: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
76a0: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
76b0: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
76c0: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
76d0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
76e0: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
76f0: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
7700: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
7710: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
7720: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
7730: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
7740: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
7750: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
7760: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
7770: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
7780: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
7790: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
77a0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
77b0: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
77c0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
77d0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
77e0: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
77f0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
7800: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
7810: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
7820: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
7830: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
7840: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
7850: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
7860: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
7870: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
7880: 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
7890: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
78a0: 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
78b0: 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
78c0: 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
78d0: 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  pName,    /* Nam
78e0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
78f0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
7900: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
7910: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
7920: 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  e table to index
7930: 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  .  Use pParse->p
7940: 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
7950: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  .  IdList *pList
7960: 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
7970: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
7980: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
7990: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  onError,     /* 
79a0: 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
79b0: 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
79c0: 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
79d0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
79e0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
79f0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
7a00: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
7a10: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7a20: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
7a30: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
7a40: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
7a50: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
7a60: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
7a70: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
7a80: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
7a90: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
7aa0: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
7ab0: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
7ac0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
7ad0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
7ae0: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
7af0: 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  llId;           
7b00: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
7b10: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
7b20: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
7b30: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7b40: 62 3b 0a 20 20 69 6e 74 20 68 69 64 65 4e 61 6d  b;.  int hideNam
7b50: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  e = 0;         /
7b60: 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20 74 61 62  * Do not put tab
7b70: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68  le name in the h
7b80: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ash table */..  
7b90: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
7ba0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
7bb0: 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
7bc0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
7bd0: 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  x;..  /*.  ** Fi
7be0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
7bf0: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
7c00: 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
7c10: 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
7c20: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
7c30: 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e!=0 ){.    asse
7c40: 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a  rt( pName!=0 );.
7c50: 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69      pTab =  sqli
7c60: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
7c70: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
7c80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7c90: 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
7ca0: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
7cb0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7cc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
7cd0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
7ce0: 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
7cf0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
7d00: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
7d10: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
7d20: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
7d30: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
7d40: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
7d50: 65 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20  e, .      " may 
7d60: 6e 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64  not have new ind
7d70: 69 63 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b  ices added", 0);
7d80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7d90: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
7da0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
7db0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
7dc0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
7dd0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
7de0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7df0: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
7e00: 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29   be indexed", 0)
7e10: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
7e20: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
7e30: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7e40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7e50: 68 69 73 20 69 6e 64 65 78 20 69 73 20 63 72 65  his index is cre
7e60: 61 74 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65  ated while re-re
7e70: 61 64 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61  ading the schema
7e80: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
7e90: 74 65 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65  ter.  ** but the
7ea0: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
7eb0: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  d with this inde
7ec0: 78 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  x is a temporary
7ed0: 20 74 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20   table, it can. 
7ee0: 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68   ** only mean th
7ef0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  at the table tha
7f00: 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  t this index is 
7f10: 72 65 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65  really associate
7f20: 64 20 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f  d with is.  ** o
7f30: 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73  ne whose name is
7f40: 20 68 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61   hidden behind a
7f50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7f60: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
7f70: 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ame..  ** Since 
7f80: 69 74 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  its table has be
7f90: 65 6e 20 73 75 70 70 72 65 73 73 65 64 2c 20 77  en suppressed, w
7fa0: 65 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73  e need to also s
7fb0: 75 70 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a  uppress the.  **
7fc0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
7fd0: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
7fe0: 6c 61 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54  lag && pTab->isT
7ff0: 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  emp ){.    goto 
8000: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
8010: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
8020: 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
8030: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
8040: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
8050: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
8060: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
8070: 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
8080: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
8090: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
80a0: 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
80b0: 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
80c0: 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
80d0: 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
80e0: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
80f0: 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
8100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
8110: 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
8120: 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
8130: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
8140: 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
8150: 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
8160: 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
8170: 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
8180: 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
8190: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
81a0: 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c  cess this index,
81b0: 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74   but we will not
81c0: 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20  .  ** store its 
81d0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68  name in the hash
81e0: 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65   table.  Set the
81f0: 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74   hideName flag t
8200: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a  o accomplish.  *
8210: 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  * this..  **.  *
8220: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
8230: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
8240: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
8250: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
8260: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
8270: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
8280: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
8290: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
82a0: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
82b0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
82c0: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
82d0: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
82e0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
82f0: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
8300: 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
8310: 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
8320: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
8330: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d  ndex */.    zNam
8340: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
8350: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
8360: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
8370: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
8380: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
8390: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
83a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
83b0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
83c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
83d0: 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54  ( pISameName->pT
83e0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  able->isTemp && 
83f0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
8400: 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65   ){.        hide
8410: 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Name = 1;.      
8420: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8430: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
8440: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8450: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
8460: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  , .           " 
8470: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
8480: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
8490: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
84a0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
84b0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
84c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
84d0: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
84e0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
84f0: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
8500: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53  ){.      if( pTS
8510: 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20  ameName->isTemp 
8520: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
8530: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
8540: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
8550: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8560: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8570: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8580: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
8590: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
85a0: 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  med ",.         
85b0: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
85c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
85d0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
85e0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
85f0: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
8600: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8610: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
8620: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
8630: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
8640: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
8650: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
8660: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
8670: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
8680: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
8690: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
86a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
86b0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
86c0: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
86d0: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
86e0: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
86f0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
8700: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
8710: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68  ate_index;.    h
8720: 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ideName = sqlite
8730: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
8740: 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20  ame)!=0;.  }..  
8750: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
8760: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
8770: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
8780: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
8790: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
87a0: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
87b0: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
87c0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
87d0: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
87e0: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
87f0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
8800: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
8810: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8820: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
8830: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
8840: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
8850: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
8860: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
8870: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8880: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
8890: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
88a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
88b0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
88c0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
88d0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
88e0: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
88f0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
8900: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
8910: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
8920: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
8930: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
8950: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
8960: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
8970: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
8980: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
8990: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
89a0: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
89b0: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
89c0: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
89d0: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
89e0: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
89f0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
8a00: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
8a10: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
8a20: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
8a30: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
8a40: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
8a50: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  ex->onError = pI
8a60: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
8a70: 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20   onError;..  /* 
8a80: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
8a90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
8aa0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
8ab0: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
8ac0: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
8ad0: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
8ae0: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
8af0: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
8b00: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
8b10: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
8b20: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
8b30: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
8b40: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
8b50: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
8b60: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
8b70: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
8b80: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
8b90: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
8ba0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
8bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8bc0: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
8bd0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
8be0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8bf0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
8c00: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
8c10: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
8c20: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
8c30: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
8c40: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
8c50: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
8c60: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
8c70: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
8c80: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
8c90: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
8ca0: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
8cb0: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
8cc0: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
8cd0: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
8ce0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
8cf0: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
8d00: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
8d10: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
8d20: 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
8d30: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
8d40: 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d  lain && !hideNam
8d50: 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  e ){.    Index *
8d60: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
8d70: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
8d80: 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78  >idxHash, pIndex
8d90: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
8da0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
8db0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
8dc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
8dd0: 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
8de0: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
8df0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
8e00: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
8e10: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
8e20: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
8e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
8e40: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8e50: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
8e60: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
8e70: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
8e80: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
8e90: 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
8ea0: 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
8eb0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
8ec0: 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
8ed0: 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
8ee0: 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
8ef0: 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
8f00: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
8f10: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
8f20: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
8f30: 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
8f40: 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
8f50: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
8f60: 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
8f70: 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
8f80: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
8f90: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
8fa0: 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
8fb0: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
8fc0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
8fd0: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
8fe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
8ff0: 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
9000: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
9010: 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
9020: 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
9030: 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
9040: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
9050: 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
9060: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
9070: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
9080: 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
9090: 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
90a0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
90b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
90c0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
90d0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
90e0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
90f0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
9100: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
9110: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
9120: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
9130: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
9140: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
9150: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
9160: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ber from the pPa
9170: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65  rse->newTnum fie
9180: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ld..  */.  if( p
9190: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
91a0: 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  && pTable!=0 ){.
91b0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
91c0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
91d0: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
91e0: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
91f0: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
9200: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
9210: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
9220: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
9230: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
9240: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
9250: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
9260: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
9270: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
9280: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
9290: 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46  *.  ** The initF
92a0: 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68  lag is 0 when th
92b0: 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
92c0: 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
92d0: 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
92e0: 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  .  The initFlag 
92f0: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
9300: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
9310: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
9320: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
9330: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
9340: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
9350: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
9360: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
9370: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
9380: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
9390: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
93a0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
93b0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
93c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
93d0: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
93e0: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
93f0: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
9400: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
9410: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
9420: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
9430: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
9440: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
9450: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
9460: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
9470: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
9480: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
9490: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
94a0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
94b0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
94c0: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e  e if( pParse->in
94d0: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
94e0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
94f0: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
9500: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
9510: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
9520: 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70  ;.    int isTemp
9530: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b   = pTab->isTemp;
9540: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
9550: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9560: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
9570: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9580: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
9590: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
95a0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
95b0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
95c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
95d0: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
95e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
95f0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
9600: 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  te, 0, 2);.     
9610: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
9620: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53  ngeP3(v, -1, MAS
9630: 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41  TER_NAME, P3_STA
9640: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
9650: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54    }.    if( !isT
9660: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
9670: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9680: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
9690: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
96a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
96b0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
96c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
96d0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
96e0: 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
96f0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
9700: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9710: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
9720: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
9730: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
9740: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33  Index->zName, P3
9750: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
9760: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9770: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
9780: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
9790: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
97a0: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
97b0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
97c0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
97d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
97e0: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
97f0: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
9800: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
9810: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
9820: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e  har*)&pIndex->tn
9830: 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  um, P3_POINTER);
9840: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
9850: 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  m = 0;.    if( p
9860: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
9870: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
9880: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9890: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
98a0: 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rAux, 1, 0);.   
98b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
98c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
98d0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
98e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
98f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9900: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
9910: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
9920: 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  }.    if( !isTem
9930: 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  p ){.      addr 
9940: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
9950: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
9960: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
9970: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
9980: 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41  ){.        n = A
9990: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
99a0: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
99b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
99c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
99d0: 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e  , addr, pStart->
99e0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
99f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9a00: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
9a10: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
9a20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9a30: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
9a40: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
9a50: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  }.    if( pTable
9a60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9a70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73 54  VdbeAddOp(v, isT
9a80: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78  emp ? OP_OpenAux
9a90: 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20 70   : OP_Open, 2, p
9aa0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
9ab0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
9ac0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
9ad0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
9ae0: 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20  IC);.      lbl2 
9af0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
9b00: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
9b10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9b20: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c  v, OP_Rewind, 2,
9b30: 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62   lbl2);.      lb
9b40: 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  l1 = sqliteVdbeA
9b50: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f  ddOp(v, OP_Recno
9b60: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 2, 0);.      f
9b70: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
9b80: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
9b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
9ba0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
9bb0: 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65 78  olumn, 2, pIndex
9bc0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a  ->aiColumn[i]);.
9bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9be0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9bf0: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20   OP_MakeIdxKey, 
9c00: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c  pIndex->nColumn,
9c10: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
9c20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9c30: 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
9c40: 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
9c50: 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  None);.      sql
9c60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9c70: 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31  OP_Next, 2, lbl1
9c80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9c90: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
9ca0: 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
9cb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9cc0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20  v, OP_Close, 2, 
9cd0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9ce0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9cf0: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
9d00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
9d10: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  le!=0 ){.      i
9d20: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
9d30: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
9d40: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ie(db);.        
9d50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9d60: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
9d70: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
9d80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
9d90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9da0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
9db0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9dc0: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
9dd0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
9de0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9df0: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
9e00: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
9e10: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
9e20: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
9e30: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
9e40: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
9e50: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
9e60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9e70: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
9e80: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
9e90: 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
9ea0: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
9eb0: 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
9ec0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9ed0: 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65  d sqliteDropInde
9ee0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
9ef0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
9f00: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
9f10: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
9f20: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
9f30: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
9f40: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
9f50: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9f60: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
9f70: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e  d ) return;.  zN
9f80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
9f90: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
9fa0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
9fb0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
9fc0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
9fd0: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
9fe0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
9ff0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
a000: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
a010: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
a020: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
a030: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69  rMsg, "no such i
a040: 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20  ndex: ", 0, .   
a050: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70       pName->z, p
a060: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
a070: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
a080: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
a090: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
a0a0: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
a0b0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
a0c0: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
a0d0: 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
a0e0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
a0f0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
a100: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
a110: 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a  dropIndex[] = {.
a120: 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57        { OP_OpenW
a130: 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20 20  rite,  0, 2,    
a140: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c     MASTER_NAME},
a150: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
a160: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
a170: 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20 20 20 7b  10),0}, .      {
a180: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
a190: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
a1a0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 2 */.      { 
a1b0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
a1c0: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
a1d0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
a1e0: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
a1f0: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
a200: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
a210: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
a220: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
a230: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
a240: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
a250: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
a260: 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20 30     0, ADDR(4), 0
a270: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
a280: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
a290: 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20 20 20 20  R(10),0},.      
a2a0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
a2b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
a2c0: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 9 */.      {
a2d0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
a2e0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
a2f0: 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 10 */.      {
a300: 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20   OP_Close,      
a310: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
a320: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62      };.    int b
a330: 61 73 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ase;.    Table *
a340: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
a350: 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c 69  Table;..    sqli
a360: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
a370: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
a380: 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73     if( !pTab->is
a390: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61  Temp ){.      ba
a3a0: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
a3b0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
a3c0: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
a3d0: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
a3e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
a3f0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32  angeP3(v, base+2
a400: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
a410: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a420: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
a430: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
a440: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
a450: 20 62 61 73 65 2b 31 30 2c 20 64 62 2d 3e 6e 65   base+10, db->ne
a460: 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  xt_cookie);.    
a470: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
a480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
a490: 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
a4a0: 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29  m, pTab->isTemp)
a4b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
a4c0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
a4d0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
a4e0: 20 4d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20   Move the index 
a4f0: 6f 6e 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  onto the pending
a500: 20 44 52 4f 50 20 71 75 65 75 65 2e 20 20 4f 72   DROP queue.  Or
a510: 2c 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  , if the index w
a520: 61 73 0a 20 20 2a 2a 20 6e 65 76 65 72 20 63 6f  as.  ** never co
a530: 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65  mmitted, just de
a540: 6c 65 74 65 20 69 74 2e 20 20 49 6e 64 69 63 65  lete it.  Indice
a550: 73 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  s on the pending
a560: 20 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a 2a   DROP queue.  **
a570: 20 67 65 74 20 64 65 6c 65 74 65 64 20 62 79 20   get deleted by 
a580: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
a590: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 77 68  rnalChanges() wh
a5a0: 65 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63  en the user exec
a5b0: 75 74 65 73 0a 20 20 2a 2a 20 61 20 43 4f 4d 4d  utes.  ** a COMM
a5c0: 49 54 2e 20 20 4f 72 20 69 66 20 61 20 72 6f 6c  IT.  Or if a rol
a5d0: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 20 74 68  lback occurs, th
a5e0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
a5f0: 65 20 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a  e DROP queue.  *
a600: 2a 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b  * are moved back
a610: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 68   into the main h
a620: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
a630: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
a640: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
a650: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
a660: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
a670: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
a680: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
a690: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
a6a0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
a6b0: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
a6c0: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
a6d0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
a6e0: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
a6f0: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
a700: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
a710: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
a720: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
a730: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
a740: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
a750: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
a760: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
a770: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
a780: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
a790: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
a7a0: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
a7b0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
a7c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
a7d0: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
a7e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
a7f0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
a800: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
a810: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
a820: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
a830: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
a840: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
a850: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
a860: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
a870: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
a880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
a890: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
a8a0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
a8b0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
a8c0: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
a8d0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
a8e0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
a8f0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
a900: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
a910: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
a920: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
a930: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
a940: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
a950: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
a960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
a970: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
a980: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
a990: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a9a0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
a9b0: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
a9c0: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
a9d0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
a9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
a9f0: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
aa00: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
aa10: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
aa20: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
aa30: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
aa40: 41 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20  AddAlias(IdList 
aa50: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
aa60: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
aa70: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49  ist && pList->nI
aa80: 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  d>0 ){.    int i
aa90: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20   = pList->nId - 
aaa0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
aab0: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
aac0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
aad0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
aae0: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
aaf0: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
ab00: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
ab10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
ab20: 65 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69  e an entire IdLi
ab30: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
ab40: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49  teIdListDelete(I
ab50: 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
ab60: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
ab70: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
ab80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
ab90: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
aba0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
abb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
abc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
abd0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
abe0: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
abf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
ac00: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
ac10: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
ac20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ac30: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
ac40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
ac50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ac60: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
ac70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
ac80: 63 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ct);.  }.  sqlit
ac90: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
aca0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
acb0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
acc0: 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20  he COPY command 
acd0: 69 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  is for compatibi
ace0: 6c 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72  lity with Postgr
acf0: 65 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69  eSQL and specifi
ad00: 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68  cially.** for th
ad10: 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61  e ability to rea
ad20: 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  d the output of 
ad30: 70 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f  pg_dump.  The fo
ad40: 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f  rmat is as.** fo
ad50: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
ad60: 43 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20  COPY table FROM 
ad70: 66 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49  file [USING DELI
ad80: 4d 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a  MITERS string].*
ad90: 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20  *.** "table" is 
ada0: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
adb0: 65 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c  e name.  We will
adc0: 20 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63   read lines of c
add0: 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65  ode from.** file
ade0: 20 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61   to fill this ta
adf0: 62 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20  ble with data.  
ae00: 46 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73  File might be "s
ae10: 74 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69  tdin".  The opti
ae20: 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65  onal.** delimite
ae30: 72 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66  r string identif
ae40: 69 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65  ies the field se
ae50: 70 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64  parators.  The d
ae60: 65 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e  efault is a tab.
ae70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
ae80: 6f 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  opy(.  Parse *pP
ae90: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
aea0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
aeb0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
aec0: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54  ableName,   /* T
aed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
aee0: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
aef0: 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a  we will insert *
af00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65  /.  Token *pFile
af10: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  name,    /* The 
af20: 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  file from which 
af30: 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d  to obtain inform
af40: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ation */.  Token
af50: 20 2a 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20   *pDelimiter,   
af60: 2f 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74  /* Use this as t
af70: 68 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74  he field delimit
af80: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  er */.  int onEr
af90: 72 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ror          /* 
afa0: 57 68 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20  What to do if a 
afb0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73  constraint fails
afc0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
afd0: 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54  pTab;.  char *zT
afe0: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  ab;.  int i;.  V
aff0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64  dbe *v;.  int ad
b000: 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78  dr, end;.  Index
b010: 20 2a 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65   *pIdx;.  sqlite
b020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b030: 62 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c  b;..  zTab = sql
b040: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
b050: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65  Token(pTableName
b060: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  );.  if( sqlite_
b070: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c  malloc_failed ||
b080: 20 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   zTab==0 ) goto 
b090: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
b0a0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
b0b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 29  dTable(db, zTab)
b0c0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
b0d0: 54 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  Tab);.  if( pTab
b0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b0f0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
b100: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
b110: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
b120: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61   0, .        pTa
b130: 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62  bleName->z, pTab
b140: 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20  leName->n, 0);. 
b150: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
b160: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79  +;.    goto copy
b170: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
b180: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
b190: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
b1a0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
b1b0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
b1c0: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
b1d0: 65 2c 0a 20 20 20 20 20 20 20 20 22 20 6d 61 79  e,.        " may
b1e0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
b1f0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
b200: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
b210: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
b220: 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
b230: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
b240: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
b250: 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20    int openOp;.  
b260: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 4d 75 6c    sqliteBeginMul
b270: 74 69 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  tiWriteOperation
b280: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 64  (pParse);.    ad
b290: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
b2a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f  ddOp(v, OP_FileO
b2b0: 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pen, 0, 0);.    
b2c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
b2d0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69 6c  P3(v, addr, pFil
b2e0: 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e  ename->z, pFilen
b2f0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
b300: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
b310: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 6f  (v, addr);.    o
b320: 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73  penOp = pTab->is
b330: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Temp ? OP_OpenWr
b340: 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69  Aux : OP_OpenWri
b350: 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  te;.    sqliteVd
b360: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f  beAddOp(v, openO
b370: 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  p, 0, pTab->tnum
b380: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
b390: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
b3a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
b3b0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f  _STATIC);.    fo
b3c0: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
b3d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b3e0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b3f0: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  , i++){.      sq
b400: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b410: 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70 49 64 78   openOp, i, pIdx
b420: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73  ->tnum);.      s
b430: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b440: 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a  3(v, -1, pIdx->z
b450: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
b460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b470: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
b480: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a  TE_CountRows ){.
b490: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b4a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b4b0: 67 65 72 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20  ger, 0, 0);  /* 
b4c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
b4d0: 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ow count */.    
b4e0: 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c 69  }.    end = sqli
b4f0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
b500: 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  v);.    addr = s
b510: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b520: 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c 20 70  , OP_FileRead, p
b530: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 29 3b  Tab->nCol, end);
b540: 0a 20 20 20 20 69 66 28 20 70 44 65 6c 69 6d 69  .    if( pDelimi
b550: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ter ){.      sql
b560: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b570: 76 2c 20 61 64 64 72 2c 20 70 44 65 6c 69 6d 69  v, addr, pDelimi
b580: 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69 74  ter->z, pDelimit
b590: 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 73 71  er->n);.      sq
b5a0: 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50  liteVdbeDequoteP
b5b0: 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  3(v, addr);.    
b5c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
b5d0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b5e0: 76 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c 20 31  v, addr, "\t", 1
b5f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
b600: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
b610: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
b620: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
b630: 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54 61 62 2d  ileColumn, pTab-
b640: 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  >iPKey, 0);.    
b650: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b660: 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
b670: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  t, 0, 0);.    }e
b680: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b690: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b6a0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
b6b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
b6c0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
b6d0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
b6e0: 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( i==pTab->iPKe
b6f0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
b700: 54 68 65 20 69 6e 74 65 67 65 72 20 70 72 69 6d  The integer prim
b710: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69  ary key column i
b720: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 4e 55  s filled with NU
b730: 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a 20 20 20  LL since its.   
b740: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73       ** value is
b750: 20 61 6c 77 61 79 73 20 70 75 6c 6c 65 64 20 66   always pulled f
b760: 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 6e  rom the record n
b770: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  umber */.       
b780: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b790: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
b7a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
b7b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b7c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b7d0: 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20  _FileColumn, i, 
b7e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
b7f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 47 65 6e 65  }.    sqliteGene
b800: 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
b810: 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61  ecks(pParse, pTa
b820: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6f  b, 0, 0, 0, 0, o
b830: 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a 20  nError, addr);. 
b840: 20 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c 65 74     sqliteComplet
b850: 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73  eInsertion(pPars
b860: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30  e, pTab, 0, 0, 0
b870: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 64  , 0);.    if( (d
b880: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
b890: 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20  E_CountRows)!=0 
b8a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
b8b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
b8c0: 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 20 20 2f  ddImm, 1, 0);  /
b8d0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f 77 20  * Increment row 
b8e0: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20  count */.    }. 
b8f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b900: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
b910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
b920: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b930: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20  bel(v, end);.   
b940: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b950: 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
b960: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e  0);.    sqliteEn
b970: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
b980: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
b990: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
b9a0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
b9b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b9c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
b9d0: 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b  umnCount, 1, 0);
b9e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b9f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
ba00: 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a  umnName, 0, 0);.
ba10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ba20: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
ba30: 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22 2c  "rows inserted",
ba40: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
ba50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ba60: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
ba70: 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  k, 1, 0);.    }.
ba80: 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61    }.  .copy_clea
ba90: 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  nup:.  return;.}
baa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d  ../*.** The non-
bab0: 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20  standard VACUUM 
bac0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
bad0: 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
bae0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c  database,.** col
baf0: 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63 65  lapse free space
bb00: 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f  , etc.  It is mo
bb10: 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  delled after the
bb20: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a   VACUUM command.
bb30: 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c  ** in PostgreSQL
bb40: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73 69  ..**.** In versi
bb50: 6f 6e 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c 69  on 1.0.x of SQLi
bb60: 74 65 2c 20 74 68 65 20 56 41 43 55 55 4d 20 63  te, the VACUUM c
bb70: 6f 6d 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61 6c  ommand would cal
bb80: 6c 0a 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67 61  l.** gdbm_reorga
bb90: 6e 69 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74 68  nize() on all th
bba0: 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
bbb0: 73 2e 20 20 42 75 74 20 62 65 67 69 6e 6e 69 6e  s.  But beginnin
bbc0: 67 0a 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30 2c  g.** with 2.0.0,
bbd0: 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
bbe0: 72 20 75 73 65 73 20 47 44 42 4d 20 73 6f 20 74  r uses GDBM so t
bbf0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73 0a  his command has.
bc00: 2a 2a 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f  ** become a no-o
bc10: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  p..*/.void sqlit
bc20: 65 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70  eVacuum(Parse *p
bc30: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
bc40: 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20  ableName){.  /* 
bc50: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
bc60: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
bc70: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
bc80: 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72  id sqliteBeginTr
bc90: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
bca0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
bcb0: 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20  rror){.  sqlite 
bcc0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  *db;..  if( pPar
bcd0: 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
bce0: 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
bcf0: 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75  b->pBe==0 ) retu
bd00: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
bd10: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
bd20: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
bd30: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64   return;.  if( d
bd40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
bd50: 45 5f 49 6e 54 72 61 6e 73 20 29 20 72 65 74 75  E_InTrans ) retu
bd60: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 42 65 67 69  rn;.  sqliteBegi
bd70: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
bd80: 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 66  pParse);.  db->f
bd90: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
bda0: 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e  nTrans;.  db->on
bdb0: 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
bdc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
bdd0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
bde0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d  /.void sqliteCom
bdf0: 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
be00: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
be10: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
be20: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
be30: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
be40: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
be50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
be60: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
be70: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
be80: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
be90: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
bea0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
beb0: 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ns)==0 ) return;
bec0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
bed0: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
bee0: 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74  .  sqliteEndWrit
bef0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
bf00: 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  e);.  db->onErro
bf10: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
bf20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
bf30: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
bf40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f  */.void sqliteRo
bf50: 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
bf60: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
bf70: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
bf80: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
bf90: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
bfa0: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
bfb0: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
bfc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
bfd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
bfe0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
bff0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
c000: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
c010: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
c020: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
c030: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
c040: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
c050: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
c060: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c070: 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29  _Rollback, 0, 0)
c080: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
c090: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
c0a0: 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rans;.  db->onEr
c0b0: 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  ror = OE_Default
c0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c0d0: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
c0e0: 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
c0f0: 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
c100: 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
c110: 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
c120: 62 61 73 65 2e 20 20 54 68 65 20 6f 70 65 72 61  base.  The opera
c130: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 74 6f  tion will be ato
c140: 6d 69 63 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65  mic in the.** se
c150: 6e 73 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  nse that it will
c160: 20 65 69 74 68 65 72 20 64 6f 20 69 74 73 20 63   either do its c
c170: 68 61 6e 67 65 73 20 63 6f 6d 70 6c 65 74 65 6c  hanges completel
c180: 79 20 6f 72 20 6e 6f 74 20 61 74 0a 2a 2a 20 61  y or not at.** a
c190: 6c 6c 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ll.  So there is
c1a0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 65 74   not need to set
c1b0: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
c1c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
c1d0: 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
c1e0: 65 66 66 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  effect..*/.void 
c1f0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
c200: 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
c210: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
c220: 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
c230: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
c240: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
c250: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 50  eturn;.  if( (pP
c260: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
c270: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
c280: 29 3d 3d 30 20 20 29 7b 0a 20 20 20 20 73 71 6c  )==0  ){.    sql
c290: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c2a0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
c2b0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
c2c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c2d0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70  _VerifyCookie, p
c2e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d  Parse->db->schem
c2f0: 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  a_cookie, 0);.  
c300: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
c310: 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Verified = 1;.  
c320: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
c330: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
c340: 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
c350: 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
c360: 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
c370: 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
c380: 62 61 73 65 2e 20 20 54 68 65 20 6f 70 65 72 61  base.  The opera
c390: 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20 62  tion might not b
c3a0: 65 20 61 74 6f 6d 69 63 20 69 6e 0a 2a 2a 20 74  e atomic in.** t
c3b0: 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 61 6e  he sense that an
c3c0: 20 65 72 72 6f 72 20 6d 61 79 20 62 65 20 64 69   error may be di
c3d0: 73 63 6f 76 65 72 65 64 20 61 6e 64 20 74 68 65  scovered and the
c3e0: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69 67 68 74   operation might
c3f0: 0a 2a 2a 20 61 62 6f 72 74 20 61 66 74 65 72 20  .** abort after 
c400: 73 6f 6d 65 20 63 68 61 6e 67 65 73 20 68 61 76  some changes hav
c410: 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 20 49 66  e been made.  If
c420: 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d   we are in the m
c430: 69 64 64 6c 65 20 0a 2a 2a 20 6f 66 20 61 20 74  iddle .** of a t
c440: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
c450: 20 74 68 69 73 20 73 65 74 73 20 61 20 63 68 65   this sets a che
c460: 63 6b 70 6f 69 6e 74 2e 20 20 49 66 20 77 65 20  ckpoint.  If we 
c470: 61 72 65 20 6e 6f 74 20 69 6e 0a 2a 2a 20 61 20  are not in.** a 
c480: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
c490: 6e 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  n start a transa
c4a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
c4b0: 71 6c 69 74 65 42 65 67 69 6e 4d 75 6c 74 69 57  qliteBeginMultiW
c4c0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
c4d0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
c4e0: 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73  Vdbe *v;.  v = s
c4f0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
c500: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
c510: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
c520: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
c530: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
c540: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
c550: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c560: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
c570: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  n, 0, 0);.    sq
c580: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c590: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
c5a0: 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63  , pParse->db->sc
c5b0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  hema_cookie, 0);
c5c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68  .    pParse->sch
c5d0: 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b  emaVerified = 1;
c5e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
c5f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c600: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
c610: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
c620: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c630: 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73  e that concludes
c640: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
c650: 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  at may have chan
c660: 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ged.** the datab
c670: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 61 20  ase.  This is a 
c680: 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63 74 69  companion functi
c690: 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72 69 74 65  on to BeginWrite
c6a0: 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a 2a 2a 20  Operation()..** 
c6b0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
c6c0: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68   was started, th
c6d0: 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e 20 20 49  en commit it.  I
c6e0: 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 77  f a checkpoint w
c6f0: 61 73 0a 2a 2a 20 73 74 61 72 74 65 64 20 74 68  as.** started th
c700: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61 74 2e 0a  en commit that..
c710: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e  */.void sqliteEn
c720: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
c730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
c740: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d    Vdbe *v;.  v =
c750: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
c760: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
c770: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
c780: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
c790: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
c7a0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Trans ){.    /* 
c7b0: 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do Nothing */.  
c7c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
c7d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c7e0: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
c7f0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e    }.}.../*.** In
c800: 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76 65  terpret the give
c810: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 62 6f  n string as a bo
c820: 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
c830: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 42 6f  static int getBo
c840: 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  olean(char *z){.
c850: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
c860: 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73  zTrue[] = { "yes
c870: 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20  ", "on", "true" 
c880: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  };.  int i;.  if
c890: 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  ( z[0]==0 ) retu
c8a0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69  rn 0;.  if( isdi
c8b0: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b  git(z[0]) || (z[
c8c0: 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67  0]=='-' && isdig
c8d0: 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20  it(z[1])) ){.   
c8e0: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b   return atoi(z);
c8f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c900: 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29  i<sizeof(azTrue)
c910: 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30  /sizeof(azTrue[0
c920: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
c930: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
c940: 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20  z,azTrue[i])==0 
c950: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
c960: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c970: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
c980: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
c990: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
c9a0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
c9b0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
c9c0: 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a  AGMA id = value.
c9d0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69  **.** The identi
c9e0: 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  fier might also 
c9f0: 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68  be a string.  Th
ca00: 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
ca10: 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e  ing, and.** iden
ca20: 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d  tifier, or a num
ca30: 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c  ber.  If minusFl
ca40: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
ca50: 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   the value is.**
ca60: 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77   a number that w
ca70: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
ca80: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a   minus sign..*/.
ca90: 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d  void sqlitePragm
caa0: 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
cab0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
cac0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e  oken *pRight, in
cad0: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
cae0: 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
caf0: 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20  .  char *zRight 
cb00: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  = 0;.  sqlite *d
cb10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cb20: 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74  .  zLeft = sqlit
cb30: 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e  eStrNDup(pLeft->
cb40: 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20  z, pLeft->n);.  
cb50: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
cb60: 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75  eft);.  if( minu
cb70: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69  sFlag ){.    zRi
cb80: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ght = 0;.    sql
cb90: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
cba0: 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70  Right, "-", 1, p
cbb0: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
cbc0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
cbd0: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
cbe0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69  qliteStrNDup(pRi
cbf0: 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
cc00: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  n);.    sqliteDe
cc10: 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20  quote(zRight);. 
cc20: 20 7d 0a 20 0a 20 20 69 66 28 20 73 71 6c 69 74   }. .  if( sqlit
cc30: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
cc40: 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20  cache_size")==0 
cc50: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 20  ){.    int size 
cc60: 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  = atoi(zRight);.
cc70: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
cc80: 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
cc90: 70 42 65 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 65  pBe, size);.  }e
cca0: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
ccb0: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
ccc0: 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30  "vdbe_trace")==0
ccd0: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
cce0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
ccf0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
cd00: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65  s |= SQLITE_Vdbe
cd10: 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Trace;.    }else
cd20: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
cd30: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62  s &= ~SQLITE_Vdb
cd40: 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20  eTrace;.    }.  
cd50: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
cd60: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
cd70: 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  , "full_column_n
cd80: 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ames")==0 ){.   
cd90: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
cda0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
cdb0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
cdc0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
cdd0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
cde0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
cdf0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
ce00: 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  Names;.    }.  }
ce10: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
ce20: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
ce30: 20 22 72 65 73 75 6c 74 5f 73 65 74 5f 64 65 74   "result_set_det
ce40: 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ails")==0 ){.   
ce50: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
ce60: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
ce70: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
ce80: 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69  LITE_ResultDetai
ce90: 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ls;.    }else{. 
cea0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
ceb0: 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73 75 6c 74  = ~SQLITE_Result
cec0: 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 20  Details;.    }. 
ced0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
cee0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
cef0: 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65  t, "count_change
cf00: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
cf10: 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
cf20: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
cf30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cf40: 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20  E_CountRows;.   
cf50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
cf60: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
cf70: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20  TE_CountRows;.  
cf80: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
cf90: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
cfa0: 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74 79 5f 72  (zLeft, "empty_r
cfb0: 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 22  esult_callbacks"
cfc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
cfd0: 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
cfe0: 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
cff0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
d000: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  NullCallback;.  
d010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
d020: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
d030: 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
d040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
d050: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
d060: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62  ICmp(zLeft, "tab
d070: 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a  le_info")==0 ){.
d080: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
d090: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
d0a0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
d0b0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
d0c0: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ght);.    if( pT
d0d0: 61 62 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47  ab ) v = sqliteG
d0e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d0f0: 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20      if( pTab && 
d100: 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  v ){.      stati
d110: 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e  c VdbeOp tableIn
d120: 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  foPreface[] = {.
d130: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
d140: 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c 20  umnCount, 5, 0, 
d150: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
d160: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
d170: 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
d180: 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20  "cid"},.        
d190: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
d1a0: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    1, 0,       "n
d1b0: 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ame"},.        {
d1c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
d1d0: 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 74 79   2, 0,       "ty
d1e0: 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  pe"},.        { 
d1f0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
d200: 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 6f 74  3, 0,       "not
d210: 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20 20  null"},.        
d220: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
d230: 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20 22 64    4, 0,       "d
d240: 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20 20  flt_value"},.   
d250: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
d260: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  i;.      sqliteV
d270: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
d280: 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49  ArraySize(tableI
d290: 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62  nfoPreface), tab
d2a0: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a  leInfoPreface);.
d2b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d2c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
d2d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d2e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d2f0: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
d300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
d310: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
d320: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
d330: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d340: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
d350: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
d360: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
d370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
d380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
d390: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d3b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
d3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
d3d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
d3e0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  ? pTab->aCol[i].
d3f0: 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c 20  zType : "text", 
d400: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d410: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d420: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d430: 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  r, pTab->aCol[i]
d440: 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20  .notNull, 0);.  
d450: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d460: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
d470: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
d480: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d490: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
d4a0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  b->aCol[i].zDflt
d4b0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d4d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
d4e0: 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20 20  back, 5, 0);.   
d4f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
d500: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
d510: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
d520: 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20  index_info")==0 
d530: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
d540: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
d550: 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
d560: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c  ;.    pIdx = sql
d570: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
d580: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
d590: 28 20 70 49 64 78 20 29 20 76 20 3d 20 73 71 6c  ( pIdx ) v = sql
d5a0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
d5b0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  e);.    if( pIdx
d5c0: 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73   && v ){.      s
d5d0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62  tatic VdbeOp tab
d5e0: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20  leInfoPreface[] 
d5f0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
d600: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c  _ColumnCount, 3,
d610: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
d620: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
d630: 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
d640: 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20      "seqno"},.  
d650: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
d660: 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
d670: 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
d680: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
d690: 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20  ame,  2, 0,     
d6a0: 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
d6b0: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
d6c0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49  .      pTab = pI
d6d0: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  dx->pTable;.    
d6e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d6f0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
d700: 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
d710: 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
d720: 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66  reface);.      f
d730: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
d740: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
d750: 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20         int cnum 
d760: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
d770: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
d780: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d790: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
d7a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d7b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d7c0: 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20  _Integer, cnum, 
d7d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
d7e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d7f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
d800: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
d810: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d820: 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e  1, pTab->aCol[cn
d830: 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  um].zName, P3_ST
d840: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
d850: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d860: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33  , OP_Callback, 3
d870: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d880: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
d890: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
d8a0: 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 6c  (zLeft, "index_l
d8b0: 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ist")==0 ){.    
d8c0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
d8d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
d8e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70    Vdbe *v;.    p
d8f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
d900: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
d910: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
d920: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c  ){.      v = sql
d930: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
d940: 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d  e);.      pIdx =
d950: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
d960: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
d970: 62 20 26 26 20 70 49 64 78 20 26 26 20 76 20 29  b && pIdx && v )
d980: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20  {.      int i = 
d990: 30 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69 63  0; .      static
d9a0: 20 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69 73   VdbeOp indexLis
d9b0: 74 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20  tPreface[] = {. 
d9c0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
d9d0: 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20  mnCount, 3, 0,  
d9e0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20       0},.       
d9f0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
da00: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  0, 0,       "
da10: 73 65 71 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  seq"},.        {
da20: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
da30: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61   1, 0,       "na
da40: 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  me"},.        { 
da50: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
da60: 32 2c 20 30 2c 20 20 20 20 20 20 20 22 75 6e 69  2, 0,       "uni
da70: 71 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  que"},.      };.
da80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
da90: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
daa0: 72 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73  raySize(indexLis
dab0: 74 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78  tPreface), index
dac0: 4c 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20  ListPreface);.  
dad0: 20 20 20 20 77 68 69 6c 65 28 70 49 64 78 29 7b      while(pIdx){
dae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
daf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
db00: 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
db10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
db20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
db30: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
db40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
db50: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
db60: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  dx->zName, P3_ST
db70: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
db80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
db90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
dba0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
dbb0: 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  None, 0);.      
dbc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dbd0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
dbe0: 2c 20 33 2c 20 30 29 3b 0a 09 2b 2b 69 3b 0a 09  , 3, 0);..++i;..
dbf0: 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65  pIdx = pIdx->pNe
dc00: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
dc10: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
dc20: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
dc30: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
dc40: 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72 61  eft, "parser_tra
dc50: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  ce")==0 ){.    e
dc60: 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74  xtern void sqlit
dc70: 65 50 61 72 73 65 72 54 72 61 63 65 28 46 49 4c  eParserTrace(FIL
dc80: 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20 20  E*, char *);.   
dc90: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
dca0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
dcb0: 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
dcc0: 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73  ce(stdout, "pars
dcd0: 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  er: ");.    }els
dce0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  e{.      sqliteP
dcf0: 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29  arserTrace(0, 0)
dd00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
dd10: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
dd20: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
dd30: 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68  t, "integrity_ch
dd40: 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eck")==0 ){.    
dd50: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 63 68  static VdbeOp ch
dd60: 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20  eckDb[] = {.    
dd70: 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74    { OP_SetInsert
dd80: 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  ,   0, 0,       
dd90: 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f   "2"},.      { O
dda0: 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 30  P_Open,        0
ddb0: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
ddc0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e        { OP_Rewin
ddd0: 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20 20 20  d,      0, 6,   
dde0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ddf0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
de00: 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
de10: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  ,.      { OP_Set
de20: 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20  Insert,   0, 0, 
de30: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
de40: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
de50: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
de60: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
de70: 6e 74 65 67 72 69 74 79 43 6b 2c 20 30 2c 20 30  ntegrityCk, 0, 0
de80: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
de90: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
dea0: 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20  unt, 1, 0,      
deb0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
dec0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
ded0: 20 30 2c 20 20 20 20 20 20 20 20 22 73 61 6e 69   0,        "sani
dee0: 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20  ty_check"},.    
def0: 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
df00: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
df10: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
df20: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
df30: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
df40: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
df50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
df60: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
df70: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63 68 65  v, ArraySize(che
df80: 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b  ckDb), checkDb);
df90: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20  .  }else..  {}. 
dfa0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
dfb0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
dfc0: 28 7a 52 69 67 68 74 29 3b 0a 7d 0a              (zRight);.}.