/ Hex Artifact Content
Login

Artifact 48bb306676b77711919adc3578655e3ebf2ac8f0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 39 34 20 32 30 30  ild.c,v 1.94 200
0310: 32 2f 30 35 2f 32 34 20 30 32 3a 30 34 3a 33 33  2/05/24 02:04:33
0320: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0330: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0340: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0350: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0360: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0370: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0380: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0390: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03a0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03b0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03c0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03d0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
03f0: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0400: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0410: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0420: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0430: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0440: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0450: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0460: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0470: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0480: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
0490: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04b0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04c0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04d0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04e0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
04f0: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0500: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0520: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0530: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0540: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0550: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0560: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0570: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0580: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
0590: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05a0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05b0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05d0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05e0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0610: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0630: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0640: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0650: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0660: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0670: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0680: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
0690: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06a0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06b0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06c0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06d0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06e0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0700: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0710: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0740: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0750: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0760: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0770: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0780: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
0790: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07a0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07c0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07d0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07e0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
07f0: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
0810: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0830: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0840: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0850: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0860: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0870: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0880: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0890: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
08a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
08b0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
08c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
08d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c    Table *p = sql
08e0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
08f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
0900: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
0910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
0920: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0930: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0940: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0950: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0960: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0970: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0980: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
0990: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
09a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
09b0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
09c0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
09d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
09e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73  {.  Index *p = s
09f0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0a00: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0a10: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0a20: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0a40: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0a50: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0a60: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0a70: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0a80: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0a90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0aa0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0ab0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0ac0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0ad0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0ae0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
0af0: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
0b00: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
0b10: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
0b20: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
0b30: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
0b40: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
0b50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
0b60: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0b70: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
0b80: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
0b90: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
0ba0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
0bb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
0bc0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
0bd0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
0be0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
0bf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
0c00: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
0c10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
0c20: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c30: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
0c40: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
0c50: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
0c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
0c70: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c80: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
0c90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
0cb0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0cc0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
0cd0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
0ce0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
0cf0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d00: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
0d10: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
0d20: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0d30: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
0d40: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
0d50: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
0d60: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
0d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
0d80: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
0d90: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
0da0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
0db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
0dc0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
0dd0: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
0de0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
0df0: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
0e00: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
0e10: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
0e20: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
0e30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
0e40: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
0e50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
0e60: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
0e70: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
0e80: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
0e90: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
0ea0: 78 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  x to the pending
0eb0: 20 44 52 4f 50 20 49 4e 44 45 58 20 71 75 65 75   DROP INDEX queu
0ec0: 65 20 69 66 20 69 74 20 68 61 73 0a 2a 2a 20 62  e if it has.** b
0ed0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  een committed.  
0ee0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 77 61  If this index wa
0ef0: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
0f00: 64 2c 20 74 68 65 6e 20 6a 75 73 74 0a 2a 2a 20  d, then just.** 
0f10: 64 65 6c 65 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  delete it..**.**
0f20: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
0f30: 70 65 6e 64 69 6e 67 20 64 72 6f 70 20 71 75 65  pending drop que
0f40: 75 65 20 61 72 65 20 64 65 6c 65 74 65 64 20 77  ue are deleted w
0f50: 68 65 6e 20 61 20 43 4f 4d 4d 49 54 20 69 73 0a  hen a COMMIT is.
0f60: 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  ** executed.  If
0f70: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75   a ROLLBACK occu
0f80: 72 73 2c 20 74 68 65 20 69 6e 64 69 63 65 73 20  rs, the indices 
0f90: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
0fa0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  nto.** the main 
0fb0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fd0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
0fe0: 6f 70 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  opIndex(sqlite *
0ff0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1000: 20 69 66 28 20 21 70 2d 3e 69 73 43 6f 6d 6d 69   if( !p->isCommi
1010: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  t ){.    sqliteU
1020: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1030: 64 65 78 28 64 62 2c 20 70 29 3b 0a 20 20 7d 65  dex(db, p);.  }e
1040: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1050: 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  pOld;.    pOld =
1060: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1070: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
1080: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
1090: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
10a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
10b0: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
10c0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
10d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10e0: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
10f0: 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a  , strlen(pOld->z
1100: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
1110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1120: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1130: 69 64 78 44 72 6f 70 2c 20 70 2c 20 30 2c 20 70  idxDrop, p, 0, p
1140: 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 72 6f 70  );.    p->isDrop
1150: 70 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ped = 1;.  }.}..
1160: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1170: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1180: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
1190: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
11a0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
11b0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11c0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
11d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
11e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
11f0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
1200: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
1210: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
1220: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
1230: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1240: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1250: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
1260: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1270: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1280: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
1290: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
12b0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
12c0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
12d0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
12e0: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
12f0: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
1300: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
1310: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
1320: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
1330: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
1340: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
1350: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
1360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
1370: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
1380: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  id sqliteDeleteT
1390: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
13a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
13b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65  .  int i;.  Inde
13c0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
13d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  t;.  if( pTable=
13e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
1400: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1420: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
1430: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
1440: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1450: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
1460: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1470: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
1480: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e  );.  }.  for(pIn
1490: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
14a0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
14b0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
14c0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
14d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
14e0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
14f0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
1500: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1510: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
1520: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1530: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
1540: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
1550: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
1560: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1570: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
1580: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
1590: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
15a0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
15b0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
15c0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
15d0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
15e0: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
15f0: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1600: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
1610: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
1620: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
1630: 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  pOld;.  assert( 
1640: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1650: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1660: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1670: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1680: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
16a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
16b0: 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49  );.  sqliteHashI
16c0: 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44 72  nsert(&db->tblDr
16d0: 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  op, p, 0, 0);.  
16e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
16f0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1700: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69 76 65  ** Move the give
1710: 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 70  n table to the p
1720: 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41 42 4c  ending DROP TABL
1730: 45 20 71 75 65 75 65 20 69 66 20 69 74 20 68 61  E queue if it ha
1740: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d 69 74  s.** been commit
1750: 74 65 64 2e 20 20 49 66 20 74 68 69 73 20 74 61  ted.  If this ta
1760: 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f  ble was never co
1770: 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6a 75  mmitted, then ju
1780: 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69 74 2e  st.** delete it.
1790: 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20 66 6f    Do the same fo
17a0: 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  r all its indice
17b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f  s..**.** Table o
17c0: 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65 75 65  n the drop queue
17d0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
17e0: 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69 6c 20  y deleted until 
17f0: 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74 61 74  a COMMIT.** stat
1800: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
1810: 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42 41 43  d.  If a ROLLBAC
1820: 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65 61 64  K occurs instead
1830: 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a 2a 2a   of a COMMIT,.**
1840: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   then the tables
1850: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1860: 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63  ue are moved bac
1870: 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a  k into the main.
1880: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ** hash table..*
1890: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18a0: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 54  litePendingDropT
18b0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
18c0: 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b 0a 20   Table *pTbl){. 
18d0: 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73 43 6f   if( !pTbl->isCo
18e0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
18f0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1900: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62 6c 29  eTable(db, pTbl)
1910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
1920: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
1930: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
1940: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c 64 20  pNext;.    pOld 
1950: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1960: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1970: 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74   pTbl->zName, st
1980: 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61 6d 65  rlen(pTbl->zName
1990: 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73 73 65  )+1,0);.    asse
19a0: 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c 20 29  rt( pOld==pTbl )
19b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
19c0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44  Insert(&db->tblD
19d0: 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20 70 54  rop, pTbl, 0, pT
19e0: 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  bl);.    for(pIn
19f0: 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49 6e 64  dex = pTbl->pInd
1a00: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a10: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  ex=pNext){.     
1a20: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
1a30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a40: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
1a50: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54  *.** Check all T
1a80: 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65  ables and Indexe
1a90: 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  s in the interna
1aa0: 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  l hash table and
1ab0: 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61   commit.** any a
1ac0: 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65  dditions or dele
1ad0: 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68  tions to those h
1ae0: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ash tables..**.*
1af0: 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67  * When executing
1b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e   CREATE TABLE an
1b10: 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  d CREATE INDEX s
1b20: 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54  tatements, the T
1b30: 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65  able.** and Inde
1b40: 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65  x structures are
1b50: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
1b60: 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ed to the hash t
1b70: 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68  ables, but.** th
1b80: 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65  e "isCommit" fie
1b90: 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20  ld is not set.  
1ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1bb0: 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  s those fields..
1bc0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1bd0: 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64  g DROP TABLE and
1be0: 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65   DROP INDEX, the
1bf0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1c00: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1c10: 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66 20 74  e moved out of t
1c20: 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78 48 61  blHash and idxHa
1c30: 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f 70 20  sh into tblDrop 
1c40: 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20 54 68  and idxDrop.  Th
1c50: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 65  is.** routine de
1c60: 6c 65 74 65 73 20 74 68 65 20 73 74 72 75 63 74  letes the struct
1c70: 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70 20 61  ure in tblDrop a
1c80: 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a 0a 2a  nd idxDrop..**.*
1c90: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
1ca0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1cb0: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
1cc0: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1cd0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1ce0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48  sqlite *db){.  H
1cf0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
1d00: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
1d10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
1d20: 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20 72 65  Changes)==0 ) re
1d30: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63 68 65  turn;.  db->sche
1d40: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1d50: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1d60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1d70: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1d80: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1d90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1da0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1db0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1dc0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1dd0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 61 62  pElem);.    pTab
1de0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  le->isCommit = 1
1df0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  ;.  }.  for(pEle
1e00: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1e10: 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70 29 3b  t(&db->tblDrop);
1e20: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e30: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e40: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1e50: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1e60: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1e80: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
1e90: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1ea0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 74  HashClear(&db->t
1eb0: 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72 28 70  blDrop);.  for(p
1ec0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1ed0: 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61 73  irst(&db->idxHas
1ee0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
1ef0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1f00: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1f10: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1f20: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1f30: 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  m);.    pIndex->
1f40: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1f50: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45 6c 65  }.  while( (pEle
1f60: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f70: 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29 29  t(&db->idxDrop))
1f80: 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  !=0 ){.    Index
1f90: 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74   *pIndex = sqlit
1fa0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  ;.    sqliteUnli
1fc0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1fd0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1fe0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
1ff0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
2000: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2010: 20 63 6f 6d 6d 69 74 20 66 6c 61 67 20 6f 6e 20   commit flag on 
2020: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 64 64  all triggers add
2030: 65 64 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ed this transact
2040: 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 70 45 6c  ion */.  for(pEl
2050: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2060: 73 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68  st(&db->trigHash
2070: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2080: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2090: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
20a0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
20b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
20c0: 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 72 69 67  Elem);.    pTrig
20d0: 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20  ger->isCommit = 
20e0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  1;.  }..  /* Del
20f0: 65 74 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ete the structur
2100: 65 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20  es for triggers 
2110: 72 65 6d 6f 76 65 64 20 74 68 69 73 20 74 72 61  removed this tra
2120: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 45  nsaction */.  pE
2130: 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68  lem = sqliteHash
2140: 46 69 72 73 74 28 26 64 62 2d 3e 74 72 69 67 44  First(&db->trigD
2150: 72 6f 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  rop);.  while( p
2160: 45 6c 65 6d 20 29 7b 0a 20 20 20 20 54 72 69 67  Elem ){.    Trig
2170: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
2180: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2190: 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Elem);.    sqlit
21a0: 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70  eDeleteTrigger(p
21b0: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 45  Trigger);.    pE
21c0: 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68  lem = sqliteHash
21d0: 4e 65 78 74 28 70 45 6c 65 6d 29 3b 0a 20 20 7d  Next(pElem);.  }
21e0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
21f0: 61 72 28 26 64 62 2d 3e 74 72 69 67 44 72 6f 70  ar(&db->trigDrop
2200: 29 3b 0a 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  );..  db->flags 
2210: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2220: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2240: 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72  runs when one or
2250: 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42   more CREATE TAB
2260: 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58  LE, CREATE INDEX
2270: 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c  ,.** DROP TABLE,
2280: 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73   or DROP INDEX s
2290: 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72  tatements gets r
22a0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65  olled back.  The
22b0: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72  .** additions or
22c0: 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61   deletions of Ta
22d0: 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74  ble and Index st
22e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a  ructures in the.
22f0: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2300: 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f   tables are undo
2310: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ne..**.** See al
2320: 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  so: sqliteCommit
2330: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2340: 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ).*/.void sqlite
2350: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
2360: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
2370: 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65  db){.  Hash toDe
2380: 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d  lete;.  HashElem
2390: 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28   *pElem;.  if( (
23a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
23b0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
23c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
23d0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28   sqliteHashInit(
23e0: 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54  &toDelete, SQLIT
23f0: 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20  E_HASH_POINTER, 
2400: 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63  0);.  db->next_c
2410: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65  ookie = db->sche
2420: 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72  ma_cookie;.  for
2430: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2440: 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48  hFirst(&db->tblH
2450: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
2460: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2470: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
2480: 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73  able *pTable = s
2490: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
24a0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70  lem);.    if( !p
24b0: 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20  Table->isCommit 
24c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48  ){.      sqliteH
24d0: 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c  ashInsert(&toDel
24e0: 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20  ete, pTable, 0, 
24f0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  pTable);.    }. 
2500: 20 7d 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: 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d  toDelete); pElem
2530: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
2540: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
2550: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c      Table *pTabl
2560: 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  e = sqliteHashDa
2570: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73  ta(pElem);.    s
2580: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
2590: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
25a0: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  able);.  }.  sql
25b0: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f  iteHashClear(&to
25c0: 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70  Delete);.  for(p
25d0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
25e0: 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f  irst(&db->tblDro
25f0: 70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  p); pElem; pElem
2600: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2610: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
2620: 6c 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73  le *pOld, *p = s
2630: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2640: 6c 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  lem);.    assert
2650: 28 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b  ( p->isCommit );
2660: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
2670: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2680: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
2690: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
26a0: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
26b0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
26c0: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
26d0: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
26e0: 6c 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f  lear(&db->tblDro
26f0: 70 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  p);.  for(pElem=
2700: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2710: 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  &db->idxHash); p
2720: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2730: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2740: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
2750: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61  Index = sqliteHa
2760: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2770: 20 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e     if( !pIndex->
2780: 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
2790: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
27a0: 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49  rt(&toDelete, pI
27b0: 6e 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29  ndex, 0, pIndex)
27c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
27d0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27e0: 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74  shFirst(&toDelet
27f0: 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  e); pElem; pElem
2800: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2810: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
2820: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2830: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2840: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
2850: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2860: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2870: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2880: 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29  Clear(&toDelete)
2890: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
28a0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
28b0: 62 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c  b->idxDrop); pEl
28c0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
28d0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
28e0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c  {.    Index *pOl
28f0: 64 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61  d, *p = sqliteHa
2900: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2910: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
2920: 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d  Commit );.    p-
2930: 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a  >isDropped = 0;.
2940: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2950: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2960: 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >idxHash, p->zNa
2970: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
2980: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
2990: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
29a0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
29b0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
29c0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
29d0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
29e0: 61 6e 79 20 74 72 69 67 67 65 72 73 20 74 68 61  any triggers tha
29f0: 74 20 68 61 76 65 6e 27 74 20 62 65 65 6e 20 63  t haven't been c
2a00: 6f 6d 6d 69 74 65 64 20 79 65 74 20 2a 2f 0a 20  ommited yet */. 
2a10: 20 66 6f 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c   for(pElem = sql
2a20: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
2a30: 2d 3e 74 72 69 67 48 61 73 68 29 3b 20 70 45 6c  ->trigHash); pEl
2a40: 65 6d 3b 20 0a 20 20 20 20 20 20 70 45 6c 65 6d  em; .      pElem
2a50: 20 3d 20 28 70 45 6c 65 6d 3f 73 71 6c 69 74 65   = (pElem?sqlite
2a60: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 3a  HashNext(pElem):
2a70: 30 29 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  0)){.    Trigger
2a80: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c   *pTrigger = sql
2a90: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2aa0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 72  m);.    if( !pTr
2ab0: 69 67 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74 20  igger->isCommit 
2ac0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2ad0: 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTbl = sqliteFin
2ae0: 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72 69 67  dTable(db, pTrig
2af0: 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20  ger->table);.   
2b00: 20 20 20 69 66 28 20 70 54 62 6c 20 29 7b 0a 20     if( pTbl ){. 
2b10: 20 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 2d         if( pTbl-
2b20: 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54 72  >pTrigger == pTr
2b30: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
2b40: 20 20 20 70 54 62 6c 2d 3e 70 54 72 69 67 67 65     pTbl->pTrigge
2b50: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
2b60: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ext;.        }el
2b70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54 72  se{.          Tr
2b80: 69 67 67 65 72 20 2a 63 63 20 3d 20 70 54 62 6c  igger *cc = pTbl
2b90: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
2ba0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 63 20        while( cc 
2bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2bc0: 66 28 20 63 63 2d 3e 70 4e 65 78 74 20 3d 3d 20  f( cc->pNext == 
2bd0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
2be0: 20 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70 4e            cc->pN
2bf0: 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d  ext = cc->pNext-
2c00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
2c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c30: 20 20 20 20 20 20 20 63 63 20 3d 20 63 63 2d 3e         cc = cc->
2c40: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
2c50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2c60: 65 72 74 28 63 63 29 3b 0a 20 20 20 20 20 20 20  ert(cc);.       
2c70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c80: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
2c90: 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68 2c  t(&db->trigHash,
2ca0: 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c   pTrigger->name,
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  .              1
2cc0: 20 2b 20 73 74 72 6c 65 6e 28 70 54 72 69 67 67   + strlen(pTrigg
2cd0: 65 72 2d 3e 6e 61 6d 65 29 2c 20 30 29 3b 0a 20  er->name), 0);. 
2ce0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
2cf0: 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  eTrigger(pTrigge
2d00: 72 29 3b 0a 20 20 20 20 20 20 70 45 6c 65 6d 20  r);.      pElem 
2d10: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
2d20: 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68 29  t(&db->trigHash)
2d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d40: 2a 20 41 6e 79 20 74 72 69 67 67 65 72 73 20 74  * Any triggers t
2d50: 68 61 74 20 77 65 72 65 20 64 72 6f 70 70 65 64  hat were dropped
2d60: 20 2d 20 70 75 74 20 27 65 6d 20 62 61 63 6b 20   - put 'em back 
2d70: 69 6e 20 70 6c 61 63 65 20 2a 2f 0a 20 20 66 6f  in place */.  fo
2d80: 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65  r(pElem = sqlite
2d90: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74  HashFirst(&db->t
2da0: 72 69 67 44 72 6f 70 29 3b 20 70 45 6c 65 6d 3b  rigDrop); pElem;
2db0: 20 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20   .      pElem = 
2dc0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2dd0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
2de0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
2df0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2e00: 45 6c 65 6d 29 3b 0a 20 20 20 20 54 61 62 6c 65  Elem);.    Table
2e10: 20 2a 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46   *pTbl = sqliteF
2e20: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72  indTable(db, pTr
2e30: 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20  igger->table);. 
2e40: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2e50: 65 72 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73  ert(&db->trigHas
2e60: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  h, pTrigger->nam
2e70: 65 2c 20 0a 20 20 20 20 20 20 20 20 73 74 72 6c  e, .        strl
2e80: 65 6e 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  en(pTrigger->nam
2e90: 65 29 20 2b 20 31 2c 20 70 54 72 69 67 67 65 72  e) + 1, pTrigger
2ea0: 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d  );.    pTrigger-
2eb0: 3e 70 4e 65 78 74 20 3d 20 70 54 62 6c 2d 3e 70  >pNext = pTbl->p
2ec0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70 54 62  Trigger;.    pTb
2ed0: 6c 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  l->pTrigger = pT
2ee0: 72 69 67 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 73  rigger;.  }..  s
2ef0: 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26  qliteHashClear(&
2f00: 64 62 2d 3e 74 72 69 67 44 72 6f 70 29 3b 0a 20  db->trigDrop);. 
2f10: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2f20: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2f30: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ges;.}../*.** Co
2f40: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
2f50: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
2f60: 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61   or index from a
2f70: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
2f80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2f90: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
2fa0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
2fb0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
2fc0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
2fd0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2fe0: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
2ff0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
3000: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
3010: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
3020: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
3030: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3040: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
3050: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3060: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
3070: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
3080: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
3090: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
30a0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
30b0: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
30c0: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
30d0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
30e0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
30f0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
3100: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
3110: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
3120: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
3130: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3140: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
3150: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
3160: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
3170: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
3180: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
3190: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
31a0: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
31b0: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
31c0: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
31d0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
31e0: 20 69 66 20 74 68 65 20 22 54 45 4d 50 22 20 6f   if the "TEMP" o
31f0: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
3200: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
3210: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
3220: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
3230: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
3240: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
3250: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
3260: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
3270: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
3280: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
3290: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
32a0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
32b0: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
32c0: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
32d0: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
32e0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
32f0: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
3300: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
3310: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
3320: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
3330: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
3340: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
3350: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
3360: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
3370: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
3380: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
3390: 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  id sqliteStartTa
33a0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
33b0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  e, Token *pStart
33c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
33d0: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54  int isTemp){.  T
33e0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
33f0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
3400: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
3410: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
3420: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
3430: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69  ;..  pParse->sFi
3440: 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61  rstToken = *pSta
3450: 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  rt;.  zName = sq
3460: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
3470: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
3480: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
3490: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
34a0: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63  fore trying to c
34b0: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
34c0: 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75  y table, make su
34d0: 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72  re the Btree for
34e0: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65  .  ** holding te
34f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69  mporary tables i
3500: 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  s open..  */.  i
3510: 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d  f( isTemp && db-
3520: 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  >pBeTemp==0 ){. 
3530: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
3540: 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  teBtreeOpen(0, 0
3550: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
3560: 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
3570: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3580: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
3590: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
35a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
35b0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
35c0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
35d0: 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
35e0: 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
35f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
3600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
3610: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3620: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3630: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
3640: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
3650: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
3660: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
3670: 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65 54 65  nTrans(db->pBeTe
3680: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
3690: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
36b0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
36c0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
36d0: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
36e0: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
36f0: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
3700: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
3710: 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  le", 0);.       
3720: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3730: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
3740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3750: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
3760: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
3770: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
3780: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
3790: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
37a0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
37b0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
37c0: 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20  r message if it 
37d0: 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  does..  **.  ** 
37e0: 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61  If we are re-rea
37f0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
3800: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
3810: 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61  ause of a schema
3820: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64  .  ** change and
3830: 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74   a new permanent
3840: 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20   table is found 
3850: 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69  whose name colli
3860: 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  des with.  ** an
3870: 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72   existing tempor
3880: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ary table, then 
3890: 69 67 6e 6f 72 65 20 74 68 65 20 6e 65 77 20 70  ignore the new p
38a0: 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a  ermanent table..
38b0: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e    ** We will con
38c0: 74 69 6e 75 65 20 70 61 72 73 69 6e 67 2c 20 62  tinue parsing, b
38d0: 75 74 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  ut the pParse->n
38e0: 61 6d 65 43 6c 61 73 68 20 66 6c 61 67 20 77 69  ameClash flag wi
38f0: 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a 20 73  ll be set.  ** s
3900: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74  o we will know t
3910: 6f 20 64 69 73 63 61 72 64 20 74 68 65 20 74 61  o discard the ta
3920: 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63 65 20  ble record once 
3930: 70 61 72 73 69 6e 67 20 68 61 73 20 66 69 6e 69  parsing has fini
3940: 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  shed..  */.  pTa
3950: 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ble = sqliteFind
3960: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29  Table(db, zName)
3970: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  ;.  if( pTable!=
3980: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  0 ){.    if( pTa
3990: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  ble->isTemp && p
39a0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
39b0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
39c0: 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a  >nameClash = 1;.
39d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
39e0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
39f0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3a00: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c  sg, "table ", 0,
3a10: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
3a20: 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ->n,.          "
3a30: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
3a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3a50: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3a60: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3a70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
3a80: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  turn;.    }.  }e
3a90: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
3aa0: 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a  >nameClash = 0;.
3ab0: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
3ac0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
3ad0: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  x(db, zName))!=0
3ae0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 21   &&.          (!
3af0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73  pIdx->pTable->is
3b00: 54 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65 2d  Temp || !pParse-
3b10: 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20  >initFlag) ){.  
3b20: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3b30: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3b40: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
3b50: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
3b60: 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20  amed ", .       
3b70: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
3b80: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3b90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
3ba0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
3bb0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
3bc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
3bd0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
3be0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3bf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
3c00: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
3c10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
3c20: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
3c30: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
3c40: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3c50: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
3c60: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
3c70: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
3c80: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
3c90: 3e 69 73 54 65 6d 70 20 3d 20 69 73 54 65 6d 70  >isTemp = isTemp
3ca0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3cb0: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
3cc0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
3cd0: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
3ce0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
3cf0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
3d00: 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  le;..  /* Begin 
3d10: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
3d20: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
3d30: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
3d40: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
3d50: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
3d60: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
3d70: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
3d80: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
3d90: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
3da0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
3db0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
3dc0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
3dd0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
3de0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
3df0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
3e00: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
3e10: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
3e20: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
3e30: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
3e40: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
3e50: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
3e60: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
3e70: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
3e80: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
3e90: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
3ea0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
3eb0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
3ec0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
3ed0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28  e->initFlag && (
3ee0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
3ef0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
3f00: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
3f10: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3f20: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 69  Parse, 0);.    i
3f30: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3f40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3f50: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3f60: 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  r, db->file_form
3f70: 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  at, 0);.      sq
3f80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f90: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
3fa0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3fc0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
3fd0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
3fe0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3ff0: 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  -1, MASTER_NAME,
4000: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4010: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4020: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
4030: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
4040: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4050: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4070: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4080: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
4090: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
40a0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
40b0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ey, 0, 0);.    }
40c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
40d0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
40e0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
40f0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
4100: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
4110: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
4120: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
4130: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4140: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
4150: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
4160: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
4170: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
4180: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
4190: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
41a0: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
41b0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
41c0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
41d0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
41e0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
41f0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
4200: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
4210: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4220: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4230: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 28 70 20  z = 0;.  if( (p 
4240: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4250: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4260: 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
4270: 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e  ring(&z, pName->
4280: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
4290: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
42a0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
42b0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
42c0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
42d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
42e0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70  liteStrICmp(z, p
42f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
4300: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4310: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
4320: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4330: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
4340: 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30 29 3b   name: ", z, 0);
4350: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4360: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
4370: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
4380: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4390: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
43a0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
43b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
43c0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
43d0: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
43e0: 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29  Col, (p->nCol+8)
43f0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
4400: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
4410: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
4420: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
4430: 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ew;.  }.  memset
4440: 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  (&p->aCol[p->nCo
4450: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  l], 0, sizeof(p-
4460: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 2d  >aCol[0]));.  p-
4470: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d  >aCol[p->nCol++]
4480: 2e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 7d 0a 0a 2f  .zName = z;.}../
4490: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
44a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
44b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
44c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
44d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
44e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
44f0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
4500: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
4510: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
4520: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
4530: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4540: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
4550: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
4560: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
4570: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
4580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
4590: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
45a0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
45b0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
45c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
45d0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
45e0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
45f0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4600: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
4610: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
4620: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
4630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4640: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4650: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
4660: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
4670: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
4680: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
4690: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
46a0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
46b0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
46c0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
46d0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
46e0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
46f0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
4700: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
4710: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4720: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
4730: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
4740: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
4750: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
4760: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
4770: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
4780: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
4790: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
47a0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
47b0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
47c0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
47d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43  .void sqliteAddC
47e0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
47f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
4800: 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  pFirst, Token *p
4810: 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Last){.  Table *
4820: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
4830: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
4840: 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  z, **pz;.  if( (
4850: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4860: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4870: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
4880: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
4890: 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20   return;.  pz = 
48a0: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  &p->aCol[i].zTyp
48b0: 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e  e;.  n = pLast->
48c0: 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e  n + Addr(pLast->
48d0: 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72 73 74  z) - Addr(pFirst
48e0: 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  ->z);.  sqliteSe
48f0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69  tNString(pz, pFi
4900: 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20  rst->z, n, 0);. 
4910: 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20   z = *pz;.  if( 
4920: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
4930: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d   for(i=j=0; z[i]
4940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
4950: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66  c = z[i];.    if
4960: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
4970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
4980: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
4990: 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
49a0: 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65  * The given toke
49b0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
49c0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c   value for the l
49d0: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
49e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
49f0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4a00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4a10: 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69  If "minusFlag" i
4a20: 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65  s true, it.** me
4a30: 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ans the value to
4a40: 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65 64  ken was preceded
4a50: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
4a60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4a70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
4a80: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
4a90: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
4aa0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
4ab0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4ac0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
4ad0: 20 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c   sqliteAddDefaul
4ae0: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
4af0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61  arse, Token *pVa
4b00: 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67  l, int minusFlag
4b10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4b20: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4b30: 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  *pz;.  if( (p = 
4b40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4b50: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4b60: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4b70: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4b80: 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e  urn;.  pz = &p->
4b90: 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20  aCol[i].zDflt;. 
4ba0: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
4bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
4bc0: 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20  String(pz, "-", 
4bd0: 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  1, pVal->z, pVal
4be0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
4bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
4c00: 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d  String(pz, pVal-
4c10: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
4c20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71  .  }.  sqliteDeq
4c30: 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a  uote(*pz);.}../*
4c40: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
4c50: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
4c60: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
4c70: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
4c80: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
4c90: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
4ca0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
4cb0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
4cc0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
4cd0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
4ce0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
4cf0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
4d00: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
4d10: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
4d20: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
4d30: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
4d40: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
4d50: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
4d60: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
4d70: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
4d80: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
4d90: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
4da0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
4db0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
4dc0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
4dd0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
4de0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
4df0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
4e00: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
4e10: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
4e20: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
4e30: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
4e40: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
4e50: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
4e60: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
4e70: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
4e80: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
4e90: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
4ea0: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
4eb0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
4ec0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
4ed0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
4ee0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
4ef0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
4f00: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
4f10: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
4f20: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
4f30: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
4f40: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
4f50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
4f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
4f70: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
4f80: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4f90: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
4fa0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
4fb0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
4fc0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
4fd0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
4fe0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
4ff0: 69 64 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d  id sqliteAddPrim
5000: 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50  aryKey(Parse *pP
5010: 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
5020: 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  ist, int onError
5030: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
5040: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
5050: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
5060: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
5070: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Col = -1;.  if( 
5080: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
5090: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61  ;.  if( pTab->ha
50a0: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
50b0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
50c0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
50d0: 2c 20 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54  , "table \"", pT
50e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
50f0: 20 20 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65      "\" has more
5100: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
5110: 79 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20  y key", 0);.    
5120: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5130: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5140: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
5150: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
5160: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
5170: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
5180: 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  - 1;.  }else if(
5190: 20 70 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29   pList->nId==1 )
51a0: 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  {.    for(iCol=0
51b0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
51c0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
51d0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
51e0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  Cmp(pList->a[0].
51f0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
5200: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
5210: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
5220: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
5230: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5240: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
5250: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5260: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
5270: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5280: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5290: 31 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  1 && .          
52a0: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
52b0: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
52c0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
52d0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
52e0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
52f0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
5300: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
5310: 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e    sqliteCreateIn
5320: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
5330: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
5340: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
5350: 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69  /*.** Come up wi
5360: 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20  th a new random 
5370: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63  value for the sc
5380: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61  hema cookie.  Ma
5390: 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e  ke sure.** the n
53a0: 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66  ew value is diff
53b0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
53c0: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ld..**.** The sc
53d0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
53e0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
53f0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
5400: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
5410: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
5420: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
5430: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
5440: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
5450: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
5460: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
5470: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
5480: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
5490: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
54a0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
54b0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
54c0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
54d0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
54e0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
54f0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
5500: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
5510: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
5520: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
5530: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
5540: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
5550: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
5560: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
5570: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
5580: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
5590: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
55a0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
55b0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
55c0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
55d0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
55e0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
55f0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
5600: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
5610: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
5620: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
5630: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
5640: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
5650: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
5660: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
5670: 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  e(sqlite *db){. 
5680: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
5690: 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61  okie==db->schema
56a0: 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64  _cookie ){.    d
56b0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d  b->next_cookie =
56c0: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
56d0: 69 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f  ie + sqliteRando
56e0: 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20  mByte() + 1;.   
56f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
5700: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
5710: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
5720: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
5730: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5740: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
5750: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
5760: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
5770: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
5780: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
5790: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
57a0: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
57b0: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
57c0: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
57d0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
57e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
57f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
5800: 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20  needQuote = 0;. 
5810: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
5820: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
5830: 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b   *z=='\'' ){ n++
5840: 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d  ; needQuote=1; }
5850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
5860: 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d  + needQuote*2;.}
5870: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
5880: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
5890: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
58a0: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
58b0: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
58c0: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
58d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
58e0: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
58f0: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
5900: 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69  ar *zIdent){.  i
5910: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
5920: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
5930: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
5940: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
5950: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
5960: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
5970: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
5980: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
5990: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
59a0: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
59b0: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
59d0: 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65  qliteKeywordCode
59e0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
59f0: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
5a00: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
5a10: 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  \'';.  for(j=0; 
5a20: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
5a30: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
5a40: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
5a50: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27   zIdent[j]=='\''
5a60: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
5a70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
5a80: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
5a90: 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20   '\'';.  z[i] = 
5aa0: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
5ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5ac0: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
5ad0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
5ae0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
5af0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
5b00: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
5b10: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
5b20: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
5b30: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
5b40: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5b50: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5b60: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
5b70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5b80: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
5b90: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29  leStmt(Table *p)
5ba0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
5bb0: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
5bc0: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
5bd0: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e  Sep2, *zEnd;.  n
5be0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
5bf0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
5c00: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
5c10: 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69  Length(p->aCol[i
5c20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
5c30: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
5c40: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
5c50: 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<40 ){.    zS
5c60: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
5c70: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
5c80: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
5c90: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
5ca0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
5cb0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
5cc0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
5cd0: 0a 20 20 6e 20 2b 3d 20 32 35 20 2b 20 36 2a 70  .  n += 25 + 6*p
5ce0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
5cf0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5d00: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
5d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5d20: 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
5d30: 54 65 6d 70 20 29 3b 0a 20 20 73 74 72 63 70 79  Temp );.  strcpy
5d40: 28 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20  (zStmt, "CREATE 
5d50: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
5d60: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
5d70: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
5d80: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
5d90: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
5da0: 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  (';.  for(i=0; i
5db0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
5dc0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
5dd0: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
5de0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
5df0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
5e00: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
5e10: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
5e20: 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  k, p->aCol[i].zN
5e30: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  ame);.  }.  strc
5e40: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
5e50: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
5e60: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
5e70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5e80: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
5e90: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
5ea0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
5eb0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
5ec0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
5ed0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
5ee0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
5ef0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
5f00: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
5f10: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
5f20: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
5f30: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
5f40: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
5f50: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
5f60: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
5f70: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
5f80: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
5f90: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
5fa0: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73  ,.** unless this
5fb0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
5fc0: 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61  table or initFla
5fd0: 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74  g==1.  When init
5fe0: 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d  Flag==1,.** it m
5ff0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6000: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
6010: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
6020: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
6030: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
6040: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
6050: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
6060: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
6070: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
6080: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
6090: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
60a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
60b0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
60c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
60d0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
60e0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
60f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
6100: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
6110: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
6120: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
6130: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
6140: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
6150: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
6160: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
6170: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
6180: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
6190: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
61a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
61b0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
61c0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
61d0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
61e0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
61f0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
6200: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6210: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
6220: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6230: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
6240: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
6250: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
6260: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
6270: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
6280: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
6290: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
62a0: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
62b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
62c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
62d0: 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  rn;..  /* Add th
62e0: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
62f0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6300: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6310: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
6320: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6330: 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20  nameClash==0 || 
6340: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
6350: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ==1 );.  if( pPa
6360: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
6370: 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  && pParse->nameC
6380: 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54  lash==0 ){.    T
6390: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
63a0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
63b0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
63c0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
63d0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
63e0: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
63f0: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
6400: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
6410: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
6420: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
6430: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
6440: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
6460: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
6470: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
6480: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
6490: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
64a0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
64b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
64c0: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
64d0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74  from a SELECT, t
64e0: 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68  hen construct th
64f0: 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63  e.  ** list of c
6500: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74  olumns and the t
6510: 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ext of the table
6520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  ..  */.  if( pSe
6530: 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c  lect ){.    Tabl
6540: 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  e *pSelTab = sql
6550: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
6560: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
6570: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
6580: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
6590: 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72  eturn;.    asser
65a0: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
65b0: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70  .    p->nCol = p
65c0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
65d0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
65e0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
65f0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
6600: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
6610: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
6620: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
6630: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a  , pSelTab);.  }.
6640: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
6650: 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65  tFlag is 1 it me
6660: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6670: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
6680: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
6690: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
66a0: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
66b0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
66c0: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
66d0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
66e0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
66f0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6700: 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70  from the .  ** p
6710: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66  Parse->newTnum f
6720: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
6730: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68   number should h
6740: 61 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a  ave been put.  *
6750: 2a 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  * there by the s
6760: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
6770: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
6780: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
6790: 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  g ){.    p->tnum
67a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
67b0: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
67c0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
67d0: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
67e0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
67f0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
6800: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
6810: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
6820: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
6830: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
6840: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
6850: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
6860: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
6870: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
6880: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
6890: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
68a0: 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65  e, then just cre
68b0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ate the table.  
68c0: 44 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65  Do not.  ** make
68d0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c   an entry in SQL
68e0: 49 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f  ITE_MASTER..  */
68f0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
6900: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6910: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
6920: 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  *v;..    v = sql
6930: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
6940: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
6950: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6960: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
6970: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
6980: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
6990: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
69a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
69b0: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
69c0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  sTemp);.      sq
69d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
69e0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
69f0: 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  &p->tnum, P3_POI
6a00: 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NTER);.    }else
6a10: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
6a20: 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
6a30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6a40: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6a50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
6a60: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
6a70: 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20  !p->isTemp ){.  
6a80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6a90: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
6aa0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
6ab0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6ac0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6ad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
6ae0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
6af0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6b00: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
6b10: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
6b20: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
6b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6b40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6b50: 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54  1, "view", P3_ST
6b60: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
6b70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6b90: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
6ba0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6bb0: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
6bc0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
6bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6bf0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
6c00: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6c10: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e  eP3(v, -1, p->zN
6c20: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
6c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6c40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
6c50: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 4, 0);.      s
6c60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6c70: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
6c80: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
6c90: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
6ca0: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
6cb0: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
6cc0: 20 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73         n = z ? s
6cd0: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
6ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6cf0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6d00: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  z, n);.        s
6d10: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
6d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
6d40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  =0 );.        n 
6d50: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
6d60: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
6d70: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20  FirstToken.z) + 
6d80: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
6d90: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6da0: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69   -1, pParse->sFi
6db0: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
6dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6dd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6de0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6df0: 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  5, 0);.      sql
6e00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6e10: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
6e20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6e30: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
6e40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6e50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6e60: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74  nteger, db->next
6e70: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
6e80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6e90: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
6ea0: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 0, 0);.     
6eb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6ec0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6ed0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6ee0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
6ef0: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e      int op = p->
6f00: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
6f10: 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57  WrAux : OP_OpenW
6f20: 72 69 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  rite;.      sqli
6f30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6f40: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
6f50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
6f60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
6f70: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
6f80: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
6f90: 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   1, 0, 0, 0);.  
6fa0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
6fb0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
6fc0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  pParse);.  }.}..
6fd0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
6fe0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
6ff0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
7000: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
7010: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
7020: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7040: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7050: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7060: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7070: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7080: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7090: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
70a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
70b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
70c0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
70d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
70e0: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
70f0: 70 53 65 6c 65 63 74 20 20 20 20 2f 2a 20 41 20  pSelect    /* A 
7100: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7110: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
7120: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
7130: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e  /.){.  Token sEn
7140: 64 3b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  d;.  Table *p;. 
7150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7160: 20 20 69 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b    int n, offset;
7170: 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54  ..  sqliteStartT
7180: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
7190: 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  gin, pName, 0);.
71a0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
71b0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
71c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
71d0: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
71e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
71f0: 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 67 6e  rn;.  }.  /* Ign
7200: 6f 72 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ore ORDER BY cla
7210: 75 73 65 73 20 6f 6e 20 61 20 53 45 4c 45 43 54  uses on a SELECT
7220: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
7230: 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
7240: 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73     sqliteExprLis
7250: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 2d  tDelete(pSelect-
7260: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7270: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
7280: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  y = 0;.  }.  p->
7290: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
72a0: 74 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  t;.  if( !pParse
72b0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
72c0: 20 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77    if( sqliteView
72d0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
72e0: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
72f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7300: 0a 20 20 7d 0a 20 20 73 45 6e 64 20 3d 20 70 50  .  }.  sEnd = pP
7310: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
7320: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
7330: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
7340: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
7350: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
7360: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
7370: 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45  ;.  n = ((int)sE
7380: 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65  nd.z) - (int)pBe
7390: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42  gin->z;.  z = pB
73a0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
73b0: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
73c0: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
73d0: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
73e0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
73f0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
7400: 20 3d 20 31 3b 0a 20 20 7a 20 3d 20 70 2d 3e 70   = 1;.  z = p->p
7410: 53 65 6c 65 63 74 2d 3e 7a 53 65 6c 65 63 74 20  Select->zSelect 
7420: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
7430: 7a 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 20 29  z, n);.  if( z )
7440: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
7450: 28 69 6e 74 29 7a 29 20 2d 20 28 69 6e 74 29 70  (int)z) - (int)p
7460: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 20 20 73 71  Begin->z;.    sq
7470: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
7480: 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74  rings(p->pSelect
7490: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  , offset);.    s
74a0: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50  qliteEndTable(pP
74b0: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
74c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
74d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ../*.** The Tabl
74e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
74f0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
7500: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
7510: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
7520: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
7530: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
7540: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
7550: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7560: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
7570: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
7580: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
7590: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
75a0: 50 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  Pare->zErrMsg..*
75b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77  /.int sqliteView
75c0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
75d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
75e0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
75f0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7600: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
7610: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
7620: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
7630: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
7640: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
7650: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
7660: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
7670: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
7680: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
7690: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
76a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
76b0: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
76c0: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
76d0: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
76e0: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
76f0: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
7700: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
7710: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
7720: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
7730: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
7740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
7750: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
7760: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
7770: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
7780: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
7790: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
77a0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
77b0: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
77c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
77d0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
77e0: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
77f0: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
7800: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
7810: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
7820: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
7830: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7840: 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c  , "view ", pTabl
7850: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
7860: 20 20 20 22 20 69 73 20 63 69 72 63 75 6c 61 72     " is circular
7870: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b  ly defined", 0);
7880: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7890: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
78a0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
78b0: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
78c0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
78d0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
78e0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
78f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
7900: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20  ble->pSelect ); 
7910: 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74  /* If nCol==0, t
7920: 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20  hen pTable must 
7930: 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70  be a VIEW */.  p
7940: 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53  Sel = pTable->pS
7950: 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74  elect;..  /* Not
7960: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
7970: 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53  to sqliteResultS
7980: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
7990: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
79a0: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
79b0: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
79c0: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
79d0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
79e0: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
79f0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
7a00: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
7a10: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
7a20: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
7a30: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
7a40: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
7a50: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
7a60: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
7a70: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
7a80: 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74  prListDup(pEList
7a90: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70  );.  if( pSel->p
7aa0: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
7ab0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
7ac0: 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72  EList;.    retur
7ad0: 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  n 1;  /* Malloc 
7ae0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
7af0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
7b00: 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73  1;.  pSelTab = s
7b10: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
7b20: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
7b30: 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70  , pSel);.  if( p
7b40: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73  SelTab ){.    as
7b50: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
7b60: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ol==0 );.    pTa
7b70: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
7b80: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
7b90: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
7ba0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
7bb0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
7bc0: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
7bd0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
7be0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
7bf0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
7c00: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c    pParse->db->fl
7c10: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e  ags |= SQLITE_Un
7c20: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65  resetViews;.  }e
7c30: 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  lse{.    pTable-
7c40: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e  >nCol = 0;.    n
7c50: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  Err++;.  }.  sql
7c60: 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  iteSelectUnbind(
7c70: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45  pSel);.  sqliteE
7c80: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
7c90: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
7ca0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
7cb0: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
7cc0: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
7cd0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
7ce0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
7cf0: 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a  VIEW pTable..**.
7d00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7d10: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
7d20: 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62  er any other tab
7d30: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f  le or view is mo
7d40: 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76  dified..** The v
7d50: 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20  iew passed into 
7d60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
7d70: 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74  ht depend direct
7d80: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
7d90: 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66  .** on the modif
7da0: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74  ied or deleted t
7db0: 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20  able so we need 
7dc0: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64  to clear the old
7dd0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73   column.** names
7de0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69   so that they wi
7df0: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
7e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e10: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
7e20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
7e30: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
7e40: 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  t i;.  if( pTabl
7e50: 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e  e==0 || pTable->
7e60: 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74  pSelect==0 ) ret
7e70: 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  urn;.  if( pTabl
7e80: 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  e->nCol==0 ) ret
7e90: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
7ea0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
7eb0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
7ec0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
7ed0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
7ee0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
7ef0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
7f00: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
7f10: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
7f20: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  i].zType);.  }. 
7f30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
7f40: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61  le->aCol);.  pTa
7f50: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
7f60: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
7f70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
7f80: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
7f90: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
7fa0: 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  EW..*/.void sqli
7fb0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
7fc0: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61  qlite *db){.  Ha
7fd0: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
7fe0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
7ff0: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
8000: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
8010: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
8020: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
8030: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
8040: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
8050: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8060: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
8070: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
8080: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
8090: 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65      sqliteViewRe
80a0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
80b0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
80c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
80d0: 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69  SQLITE_UnresetVi
80e0: 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ews;.}../*.** Gi
80f0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
8100: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
8110: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
8120: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
8130: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
8140: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
8150: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
8160: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
8170: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
8180: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8190: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
81a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
81b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
81c0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
81d0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
81e0: 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  en(pTok);.  if( 
81f0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
8200: 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  n 0;.  pTab = sq
8210: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
8220: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
8230: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
8240: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
8250: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
8260: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
8270: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8280: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
8290: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54  , 0, .        pT
82a0: 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20  ok->z, pTok->n, 
82b0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
82c0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
82d0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
82e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
82f0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
8300: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
8310: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
8320: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
8330: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8340: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
8350: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
8360: 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61  liteDropTable(Pa
8370: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8380: 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  en *pName, int i
8390: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
83a0: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
83b0: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
83c0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
83d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
83e0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
83f0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
8400: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
8410: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
8420: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
8430: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b  (pParse, pName);
8440: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
8450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8460: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
8470: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
8480: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8490: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
84a0: 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e ", pTable->zNa
84b0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61  me, .       " ma
84c0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
84d0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
84e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
84f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
8500: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c   isView && pTabl
8510: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  e->pSelect==0 ){
8520: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8530: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8540: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
8550: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
8560: 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20   table ",.      
8570: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
8580: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8590: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
85a0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  n;.  }.  if( !is
85b0: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
85c0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
85d0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
85e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
85f0: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
8600: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 22  to delete view "
8610: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
8620: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
8630: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
8640: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
8650: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
8660: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
8670: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
8680: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
8690: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
86a0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
86b0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
86c0: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
86d0: 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61  ic VdbeOp dropTa
86e0: 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ble[] = {.      
86f0: 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  { OP_OpenWrite, 
8700: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 4d 41   0, 2,        MA
8710: 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20  STER_NAME},.    
8720: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
8730: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20     0, ADDR(9),  
8740: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
8750: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
8760: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32          0}, /* 2
8770: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
8780: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
8790: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
87a0: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
87b0: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
87c0: 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20  0}, /* 4 */.    
87d0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
87e0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
87f0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
8800: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
8810: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
8820: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
8830: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
8840: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
8850: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
8860: 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a 20 38  DR(4),  0}, /* 8
8870: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
8880: 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30 2c  nteger,    0, 0,
8890: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39          0}, /* 9
88a0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
88b0: 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c  etCookie,  0, 0,
88c0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
88d0: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
88e0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
88f0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49  0},.    };.    I
8900: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
8910: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
8920: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
8930: 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 44 72 6f  , 0);.    /* Dro
8940: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
8950: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8960: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
8970: 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 77 68  ropped */.    wh
8980: 69 6c 65 28 20 70 54 61 62 6c 65 2d 3e 70 54 72  ile( pTable->pTr
8990: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 54  igger ){.      T
89a0: 6f 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20 20 74  oken tt;.      t
89b0: 74 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  t.z = pTable->pT
89c0: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20  rigger->name;.  
89d0: 20 20 20 20 74 74 2e 6e 20 3d 20 73 74 72 6c 65      tt.n = strle
89e0: 6e 28 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  n(pTable->pTrigg
89f0: 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  er->name);.     
8a00: 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67   sqliteDropTrigg
8a10: 65 72 28 70 50 61 72 73 65 2c 20 26 74 74 2c 20  er(pParse, &tt, 
8a20: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
8a30: 28 20 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  ( !pTable->isTem
8a40: 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73 65 20  p ){.      base 
8a50: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
8a60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
8a70: 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64  ze(dropTable), d
8a80: 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ropTable);.     
8a90: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8aa0: 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20 70  eP3(v, base+2, p
8ab0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
8ac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  ;.      sqliteCh
8ad0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
8ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8af0: 43 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65  ChangeP1(v, base
8b00: 2b 39 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  +9, db->next_coo
8b10: 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kie);.    }.    
8b20: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
8b30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8b40: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
8b50: 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d  oy, pTable->tnum
8b60: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
8b70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
8b80: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
8b90: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8ba0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
8bb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8bc0: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
8bd0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54  , pIdx->tnum, pT
8be0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  able->isTemp);. 
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8c00: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
8c10: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
8c20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
8c30: 20 74 68 65 20 74 61 62 6c 65 20 28 61 6e 64 20   the table (and 
8c40: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 29  all its indices)
8c50: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
8c60: 44 52 4f 50 20 71 75 65 75 65 2e 0a 20 20 2a 2a  DROP queue..  **
8c70: 20 4f 72 2c 20 69 66 20 74 68 65 20 74 61 62 6c   Or, if the tabl
8c80: 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f 6d 6d  e was never comm
8c90: 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65 6c 65  itted, just dele
8ca0: 74 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 74  te it.  If the t
8cb0: 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 62 65  able.  ** has be
8cc0: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 61 6e 64  en committed and
8cd0: 20 69 73 20 70 6c 61 63 65 64 20 6f 6e 20 74 68   is placed on th
8ce0: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71  e pending DROP q
8cf0: 75 65 75 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  ueue, then the. 
8d00: 20 2a 2a 20 64 65 6c 65 74 65 20 77 69 6c 6c 20   ** delete will 
8d10: 6f 63 63 75 72 20 77 68 65 6e 20 73 71 6c 69 74  occur when sqlit
8d20: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
8d30: 68 61 6e 67 65 73 28 29 20 65 78 65 63 75 74 65  hanges() execute
8d40: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  s..  **.  ** Exc
8d50: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
8d60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
8d70: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
8d80: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
8d90: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
8da0: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
8db0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
8dc0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
8dd0: 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69  .    sqlitePendi
8de0: 6e 67 44 72 6f 70 54 61 62 6c 65 28 64 62 2c 20  ngDropTable(db, 
8df0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d  pTable);.    db-
8e00: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
8e10: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
8e20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
8e30: 52 65 73 65 74 41 6c 6c 28 64 62 29 3b 0a 7d 0a  ResetAll(db);.}.
8e40: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
8e50: 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
8e60: 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e   SQL table.  pIn
8e70: 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20  dex is the name 
8e80: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
8e90: 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74   and pTable is t
8ea0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
8eb0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
8ec0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
8ed0: 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
8ee0: 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
8ef0: 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
8f00: 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
8f10: 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
8f20: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
8f30: 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
8f40: 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
8f50: 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
8f60: 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
8f70: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
8f80: 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
8f90: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
8fa0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
8fb0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
8fc0: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
8fd0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8fe0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
8ff0: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
9000: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
9010: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
9020: 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
9030: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
9040: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
9050: 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
9060: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
9070: 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
9080: 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
9090: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
90a0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
90b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72  */.void sqliteCr
90c0: 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
90d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
90e0: 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
90f0: 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
9100: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
9110: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
9120: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
9130: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
9140: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
9150: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
9160: 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  table to index. 
9170: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
9180: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
9190: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
91a0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
91b0: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
91c0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
91d0: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
91e0: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
91f0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
9200: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
9210: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
9220: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
9230: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
9240: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9250: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
9260: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
9270: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
9280: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
9290: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
92a0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
92b0: 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
92c0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
92d0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
92e0: 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  dex;   /* The in
92f0: 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
9300: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
9310: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
9320: 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
9330: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
9340: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
9350: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
9360: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  st */.  sqlite *
9370: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9380: 0a 20 20 69 6e 74 20 68 69 64 65 4e 61 6d 65 20  .  int hideName 
9390: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
93a0: 44 6f 20 6e 6f 74 20 70 75 74 20 74 61 62 6c 65  Do not put table
93b0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73   name in the has
93c0: 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  h table */..  if
93d0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
93e0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
93f0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
9400: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9410: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
9420: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9430: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
9440: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
9450: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
9460: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  */.  if( pTable!
9470: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
9480: 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( pName!=0 );.  
9490: 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65    pTab =  sqlite
94a0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
94b0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
94c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
94d0: 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
94e0: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
94f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9500: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
9510: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
9520: 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
9530: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
9540: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
9550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
9560: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
9570: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
9580: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
9590: 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f   .      " may no
95a0: 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63  t have new indic
95b0: 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20  es added", 0);. 
95c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
95d0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
95e0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
95f0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
9600: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
9610: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
9620: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9630: 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
9640: 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a  e indexed", 0);.
9650: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9660: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
9670: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9680: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
9690: 73 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  s index is creat
96a0: 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64  ed while re-read
96b0: 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61 20 66  ing the schema f
96c0: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
96d0: 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74  r.  ** but the t
96e0: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
96f0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
9700: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
9710: 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a  able, it can.  *
9720: 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74  * only mean that
9730: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9740: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 72 65  this index is re
9750: 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20  ally associated 
9760: 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  with is.  ** one
9770: 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68   whose name is h
9780: 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74  idden behind a t
9790: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77  emporary table w
97a0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
97b0: 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74  e..  ** Since it
97c0: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
97d0: 20 73 75 70 70 72 65 73 73 65 64 2c 20 77 65 20   suppressed, we 
97e0: 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70  need to also sup
97f0: 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69  press the.  ** i
9800: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
9810: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
9820: 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54 65 6d  g && pTab->isTem
9830: 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  p ){.    goto ex
9840: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9850: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9860: 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
9870: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
9880: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9890: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
98a0: 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
98b0: 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
98c0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
98d0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
98e0: 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
98f0: 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
9900: 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
9910: 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
9920: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
9930: 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
9940: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9950: 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
9960: 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
9970: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
9980: 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
9990: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
99a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
99b0: 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
99c0: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
99d0: 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
99e0: 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c 20 62  ss this index, b
99f0: 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a 20  ut we will not. 
9a00: 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20 6e 61   ** store its na
9a10: 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  me in the hash t
9a20: 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65 20 68  able.  Set the h
9a30: 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f 20  ideName flag to 
9a40: 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a 20  accomplish.  ** 
9a50: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
9a60: 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
9a70: 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
9a80: 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
9a90: 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
9aa0: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
9ab0: 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
9ac0: 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
9ad0: 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
9ae0: 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
9af0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61  .    Index *pISa
9b00: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
9b10: 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
9b20: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
9b30: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53  /.    Table *pTS
9b40: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
9b50: 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
9b60: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
9b70: 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20  ex */.    zName 
9b80: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
9b90: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
9ba0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
9bb0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9bc0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9bd0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
9be0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
9bf0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  dex(db, zName))!
9c00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9c10: 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61 62  pISameName->pTab
9c20: 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50  le->isTemp && pP
9c30: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
9c40: 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61  {.        hideNa
9c50: 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  me = 1;.      }e
9c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9c70: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
9c80: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
9c90: 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20  index ", zName, 
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  .           " al
9cb0: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
9cc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
9cd0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
9ce0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
9cf0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
9d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9d10: 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
9d20: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
9d30: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b  b, zName))!=0 ){
9d40: 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 61 6d  .      if( pTSam
9d50: 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26 26  eName->isTemp &&
9d60: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
9d70: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64  g ){.        hid
9d80: 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20  eName = 1;.     
9d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9da0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9db0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
9dc0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
9dd0: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
9de0: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
9df0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
9e00: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9e10: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
9e20: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9e30: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9e40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
9e50: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
9e60: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
9e70: 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
9e80: 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
9e90: 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
9ea0: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
9eb0: 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
9ec0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
9ed0: 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  d)",n);.    zNam
9ee0: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
9ef0: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
9f00: 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e  e, "(", pTab->zN
9f10: 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78  ame, " autoindex
9f20: 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20   ", zBuf, 0);.  
9f30: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9f40: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
9f50: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68 69 64  e_index;.    hid
9f60: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
9f70: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
9f80: 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e)!=0;.  }..  /*
9f90: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
9fa0: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
9fb0: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
9fc0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
9fd0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
9fe0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
9ff0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
a000: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
a010: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
a020: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
a030: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
a040: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
a050: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a060: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
a070: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
a080: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
a090: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
a0a0: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
a0b0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
a0c0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
a0d0: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
a0e0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
a0f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
a100: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
a110: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
a120: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
a130: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
a140: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
a150: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
a160: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
a170: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
a180: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
a190: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
a1a0: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
a1b0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
a1c0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a1d0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
a1e0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
a1f0: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
a200: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
a210: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
a220: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
a230: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
a240: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
a250: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
a260: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
a270: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
a280: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
a290: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
a2a0: 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f  ex->isUnique = o
a2b0: 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 63  nError;..  /* Sc
a2c0: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
a2d0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
a2e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
a2f0: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
a300: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
a310: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
a320: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
a330: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
a340: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
a350: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
a360: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
a370: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
a380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
a390: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
a3a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
a3b0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
a3c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
a3d0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
a3e0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
a3f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
a400: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
a410: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a420: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
a430: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
a440: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
a450: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68 61  e, .        " ha
a460: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
a470: 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  d ", pList->a[i]
a480: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
a490: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a4a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
a4b0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
a4c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
a4d0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
a4e0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
a4f0: 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d  lumn[i] = j;.  }
a500: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
a510: 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
a520: 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
a530: 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
a540: 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
a550: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
a560: 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
a570: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
a580: 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65 20  in && !hideName 
a590: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
a5a0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
a5b0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69  ashInsert(&db->i
a5c0: 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e  dxHash, pIndex->
a5d0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
a5e0: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
a5f0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a600: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
a610: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
a620: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
a630: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
a640: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
a650: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
a660: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a670: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
a680: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
a690: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
a6a0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
a6b0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
a6c0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
a6d0: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
a6e0: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
a6f0: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
a700: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
a710: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
a720: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
a730: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
a740: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
a750: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
a760: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
a770: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
a780: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
a790: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
a7a0: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
a7b0: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
a7c0: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
a7d0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
a7e0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
a7f0: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
a800: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
a810: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
a820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
a830: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
a840: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
a850: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
a860: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
a870: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
a880: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
a890: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
a8a0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
a8b0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
a8c0: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
a8d0: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
a8e0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
a8f0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a900: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
a910: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
a920: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
a930: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
a940: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
a950: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
a960: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
a970: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
a980: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
a990: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
a9a0: 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  r from the pPars
a9b0: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
a9c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
a9d0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
a9e0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
a9f0: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
aa00: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
aa10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
aa20: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
aa30: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
aa40: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
aa50: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
aa60: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
aa70: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
aa80: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
aa90: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
aaa0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
aab0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
aac0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
aad0: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
aae0: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
aaf0: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
ab00: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
ab10: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
ab20: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
ab30: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
ab40: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
ab50: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
ab60: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
ab70: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
ab80: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
ab90: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
aba0: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
abb0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
abc0: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
abd0: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
abe0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
abf0: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
ac00: 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d  .  ** If pTable=
ac10: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
ac20: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
ac30: 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
ac40: 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
ac50: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
ac60: 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
ac70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
ac80: 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
ac90: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
aca0: 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
acb0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
acc0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
acd0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
ace0: 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
acf0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
ad00: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
ad10: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
ad20: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
ad30: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
ad40: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
ad50: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
ad60: 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d      int isTemp =
ad70: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a   pTab->isTemp;..
ad80: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
ad90: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ada0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
adb0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
adc0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
add0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
ade0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
adf0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ae00: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
ae10: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
ae20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ae30: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
ae40: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
ae50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
ae60: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41  angeP3(v, -1, MA
ae70: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
ae80: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
ae90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
aea0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
aeb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aec0: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
aed0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
aee0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
aef0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
af10: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
af20: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
af30: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
af40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
af50: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
af60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
af70: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
af80: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50  pIndex->zName, P
af90: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
afa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
afb0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
afc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
afd0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
afe0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
aff0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
b000: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
b010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b020: 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
b030: 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  x, 0, isTemp);. 
b040: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b050: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
b060: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74  char*)&pIndex->t
b070: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
b080: 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  ;.    pIndex->tn
b090: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
b0a0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
b0b0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
b0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b0d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b0e0: 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20  WrAux, 1, 0);.  
b0f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b100: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b110: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
b120: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
b130: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b140: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
b150: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b160: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65   }.    if( !isTe
b170: 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  mp ){.      addr
b180: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
b190: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
b1a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
b1b0: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
b1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
b1d0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
b1e0: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
b1f0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 1;.        sql
b200: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b210: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
b220: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  >z, n);.      }.
b230: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
b250: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
b260: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b270: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
b280: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
b290: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c   }.    if( pTabl
b2a0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
b2b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73  eVdbeAddOp(v, is
b2c0: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75  Temp ? OP_OpenAu
b2d0: 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20  x : OP_Open, 2, 
b2e0: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
b2f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b300: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
b310: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
b320: 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  TIC);.      lbl2
b330: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
b340: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
b350: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b360: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
b370: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
b380: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
b390: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
b3a0: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
b3b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
b3c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
b3d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b3e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b3f0: 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65  Column, 2, pInde
b400: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  x->aiColumn[i]);
b410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b420: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b430: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
b440: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
b450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b460: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b470: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
b480: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
b490: 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  _None);.      sq
b4a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b4b0: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
b4c0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b4d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b4e0: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
b4f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b500: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
b510: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b520: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b530: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
b540: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
b550: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
b560: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
b570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61         sqliteCha
b580: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20  ngeCookie(db);. 
b590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b5a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b5b0: 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63  eger, db->next_c
b5c0: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
b5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b5e0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
b5f0: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 0, 0);.     
b600: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b610: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b620: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
b630: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
b640: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
b650: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
b660: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
b670: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
b680: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
b690: 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  ex:.  sqliteIdLi
b6a0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
b6b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
b6c0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
b6d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b6e0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
b6f0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
b700: 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
b710: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
b720: 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
b730: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
b740: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
b750: 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
b760: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
b770: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
b780: 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  ndex;.  char *zN
b790: 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ame;.  Vdbe *v;.
b7a0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
b7b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
b7c0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
b7d0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
b7e0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
b7f0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
b800: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
b810: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
b820: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
b830: 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  urn;.  pIndex = 
b840: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
b850: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
b860: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
b870: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
b880: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
b890: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
b8a0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
b8b0: 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c  uch index: ", 0,
b8c0: 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d   .        pName-
b8d0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
b8e0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
b8f0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
b900: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
b910: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
b920: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
b930: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
b940: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
b950: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
b960: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
b970: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
b980: 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d  beOp dropIndex[]
b990: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
b9a0: 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32  OpenWrite,  0, 2
b9b0: 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e  ,       MASTER_N
b9c0: 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  AME},.      { OP
b9d0: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
b9e0: 41 44 44 52 28 31 30 29 2c 30 7d 2c 20 0a 20 20  ADDR(10),0}, .  
b9f0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
ba00: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
ba10: 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20   0}, /* 2 */.   
ba20: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
ba30: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
ba40: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
ba50: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
ba60: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 20         0}, /* 4 
ba70: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
ba80: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
ba90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
baa0: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
bab0: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
bac0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
bad0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
bae0: 34 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  4), 0},.      { 
baf0: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
bb00: 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c 0a 20  , ADDR(10),0},. 
bb10: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
bb20: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
bb30: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
bb40: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
bb50: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
bb60: 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20   0}, /* 10 */.  
bb70: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
bb80: 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ie,  0, 0,      
bb90: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
bba0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30  Close,      0, 0
bbb0: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
bbc0: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
bbd0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
bbe0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
bbf0: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65  e;..    sqliteBe
bc00: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
bc10: 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  n(pParse, 0);.  
bc20: 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73 54    if( !pTab->isT
bc30: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73  emp ){.      bas
bc40: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
bc50: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
bc60: 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c  Size(dropIndex),
bc70: 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20   dropIndex);.   
bc80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
bc90: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c  ngeP3(v, base+2,
bca0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
bcb0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
bcc0: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
bcd0: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20  okie(db);.      
bce0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
bcf0: 50 31 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64  P1(v, base+10, d
bd00: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b  b->next_cookie);
bd10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bd20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
bd30: 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78  _Destroy, pIndex
bd40: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73  ->tnum, pTab->is
bd50: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
bd60: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
bd70: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
bd80: 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 69  .  /* Move the i
bd90: 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65 20 70 65  ndex onto the pe
bda0: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
bdb0: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e  .  Or, if the in
bdc0: 64 65 78 20 77 61 73 0a 20 20 2a 2a 20 6e 65 76  dex was.  ** nev
bdd0: 65 72 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75  er committed, ju
bde0: 73 74 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49  st delete it.  I
bdf0: 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 70 65  ndices on the pe
be00: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
be10: 0a 20 20 2a 2a 20 67 65 74 20 64 65 6c 65 74 65  .  ** get delete
be20: 64 20 62 79 20 73 71 6c 69 74 65 43 6f 6d 6d 69  d by sqliteCommi
be30: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
be40: 28 29 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  () when the user
be50: 20 65 78 65 63 75 74 65 73 0a 20 20 2a 2a 20 61   executes.  ** a
be60: 20 43 4f 4d 4d 49 54 2e 20 20 4f 72 20 69 66 20   COMMIT.  Or if 
be70: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
be80: 73 2c 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  s, the elements 
be90: 6f 66 20 74 68 65 20 44 52 4f 50 20 71 75 65 75  of the DROP queu
bea0: 65 0a 20 20 2a 2a 20 61 72 65 20 6d 6f 76 65 64  e.  ** are moved
beb0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d   back into the m
bec0: 61 69 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  ain hash table..
bed0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
bee0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
bef0: 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67     sqlitePending
bf00: 44 72 6f 70 49 6e 64 65 78 28 64 62 2c 20 70 49  DropIndex(db, pI
bf10: 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ndex);.    db->f
bf20: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
bf30: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
bf40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  }.}../*.** Appen
bf50: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
bf60: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
bf70: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
bf80: 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
bf90: 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
bfa0: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
bfb0: 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
bfc0: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
bfd0: 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
bfe0: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
bff0: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
c000: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
c010: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c020: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c030: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
c040: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
c050: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
c060: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
c070: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49    if( (pList->nI
c080: 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  d & 7)==0 ){.   
c090: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
c0a0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20  tem *a;.    a = 
c0b0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
c0c0: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
c0d0: 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c  nId+8)*sizeof(pL
c0e0: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
c0f0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
c100: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
c110: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c120: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c130: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
c140: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
c150: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
c160: 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
c170: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c180: 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  ));.  if( pToken
c190: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
c1a0: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
c1b0: 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b  ist->nId].zName;
c1c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
c1d0: 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e  tring(pz, pToken
c1e0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
c1f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
c200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c210: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
c220: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
c230: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
c240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
c250: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
c260: 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e  }.  }.  pList->n
c270: 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
c280: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
c290: 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
c2a0: 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
c2b0: 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
c2c0: 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
c2d0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
c2e0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
c2f0: 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
c300: 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
c310: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
c320: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
c330: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
c340: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
c350: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
c360: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53  SrcList *sqliteS
c370: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
c380: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
c390: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
c3a0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
c3b0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
c3c0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c3d0: 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
c3e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
c3f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c400: 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 20 26  ( (pList->nSrc &
c410: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   7)==0 ){.    st
c420: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
c430: 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71  m *a;.    a = sq
c440: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
c450: 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 53  t->a, (pList->nS
c460: 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69  rc+8)*sizeof(pLi
c470: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
c480: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c490: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
c4a0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c4c0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
c4d0: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
c4e0: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
c4f0: 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
c500: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c510: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
c520: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
c530: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
c540: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d  List->nSrc].zNam
c550: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
c560: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
c570: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
c580: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
c590: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
c5a0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
c5b0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
c5c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
c5d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c5e0: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
c5f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
c600: 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
c610: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
c620: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
c630: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
c640: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
c650: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
c660: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
c670: 69 74 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69  iteSrcListAddAli
c680: 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
c690: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
c6a0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
c6b0: 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
c6c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
c6d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a  List->nSrc - 1;.
c6e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
c6f0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
c700: 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e  ].zAlias, pToken
c710: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
c720: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
c730: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
c740: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d  ].zAlias);.  }.}
c750: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c760: 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
c770: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65  d sqliteIdListDe
c780: 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
c790: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
c7a0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
c7b0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
c7c0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
c7d0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
c7e0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
c7f0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
c800: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
c810: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
c820: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
c830: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
c840: 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
c850: 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
c860: 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
c870: 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  oid sqliteSrcLis
c880: 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
c890: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
c8a0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
c8b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
c8c0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c8d0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
c8e0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
c8f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
c900: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
c910: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
c920: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
c930: 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c  >a[i].pTab && pL
c940: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e  ist->a[i].pTab->
c950: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
c960: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
c970: 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
c980: 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
c990: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c   }.    sqliteSel
c9a0: 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  ectDelete(pList-
c9b0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
c9c0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
c9d0: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
c9e0: 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pOn);.    sqlit
c9f0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
ca00: 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67  ist->a[i].pUsing
ca10: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
ca20: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
ca30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
ca40: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t);.}../*.** The
ca50: 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73   COPY command is
ca60: 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69   for compatibili
ca70: 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53  ty with PostgreS
ca80: 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69  QL and specifici
ca90: 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ally.** for the 
caa0: 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20  ability to read 
cab0: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67  the output of pg
cac0: 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d  _dump.  The form
cad0: 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c  at is as.** foll
cae0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f  ows:.**.**    CO
caf0: 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69  PY table FROM fi
cb00: 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49  le [USING DELIMI
cb10: 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a  TERS string].**.
cb20: 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e  ** "table" is an
cb30: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
cb40: 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72  name.  We will r
cb50: 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64  ead lines of cod
cb60: 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74  e from.** file t
cb70: 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c  o fill this tabl
cb80: 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69  e with data.  Fi
cb90: 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64  le might be "std
cba0: 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e  in".  The option
cbb0: 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20  al.** delimiter 
cbc0: 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65  string identifie
cbd0: 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61  s the field sepa
cbe0: 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66  rators.  The def
cbf0: 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a  ault is a tab..*
cc00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70  /.void sqliteCop
cc10: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cc20: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
cc30: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
cc40: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
cc50: 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65  leName,   /* The
cc60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
cc70: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
cc80: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a   will insert */.
cc90: 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61    Token *pFilena
cca0: 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69  me,    /* The fi
ccb0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
ccc0: 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74   obtain informat
ccd0: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
cce0: 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a  pDelimiter,   /*
ccf0: 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65   Use this as the
cd00: 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72   field delimiter
cd10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
cd20: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  r          /* Wh
cd30: 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63 6f  at to do if a co
cd40: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20 2a  nstraint fails *
cd50: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
cd60: 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 62  ab;.  char *zTab
cd70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  ;.  int i;.  Vdb
cd80: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72  e *v;.  int addr
cd90: 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a  , end;.  Index *
cda0: 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a  pIdx;.  sqlite *
cdb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cdc0: 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74  ..  zTab = sqlit
cdd0: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
cde0: 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b  ken(pTableName);
cdf0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
ce00: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a  lloc_failed || z
ce10: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f  Tab==0 ) goto co
ce20: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54  py_cleanup;.  pT
ce30: 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  ab = sqliteTable
ce40: 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61 72  NameToTable(pPar
ce50: 73 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  se, zTab);.  sql
ce60: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
ce70: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
ce80: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
ce90: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  ;.  v = sqliteGe
cea0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ceb0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e   if( v ){.    in
cec0: 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71  t openOp;.    sq
ced0: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
cee0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
cef0: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
cf00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cf10: 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30  , OP_FileOpen, 0
cf20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cf30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
cf40: 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  addr, pFilename-
cf50: 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e  >z, pFilename->n
cf60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
cf70: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
cf80: 64 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20  dr);.    openOp 
cf90: 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f  = pTab->isTemp ?
cfa0: 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20   OP_OpenWrAux : 
cfb0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
cfc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cfd0: 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20  p(v, openOp, 0, 
cfe0: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
cff0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
d000: 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
d010: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
d020: 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c  C);.    for(i=1,
d030: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
d040: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d050: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29  Idx->pNext, i++)
d060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
d070: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f  beAddOp(v, openO
d080: 70 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  p, i, pIdx->tnum
d090: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
d0a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d0b0: 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
d0c0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d0d0: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  }.    if( db->fl
d0e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
d0f0: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20  ntRows ){.      
d100: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d110: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
d120: 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61  , 0);  /* Initia
d130: 6c 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75  lize the row cou
d140: 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  nt */.    }.    
d150: 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65  end = sqliteVdbe
d160: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d170: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
d180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
d190: 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e  ileRead, pTab->n
d1a0: 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69  Col, end);.    i
d1b0: 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b  f( pDelimiter ){
d1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d1d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
d1e0: 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a  r, pDelimiter->z
d1f0: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29  , pDelimiter->n)
d200: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d210: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
d220: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
d230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d240: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
d250: 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20  r, "\t", 1);.   
d260: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d   }.    if( pTab-
d270: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
d280: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d290: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c  Op(v, OP_FileCol
d2a0: 75 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79  umn, pTab->iPKey
d2b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d2c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d2d0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
d2e0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
d2f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d300: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
d310: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
d320: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
d330: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
d340: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
d350: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
d360: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
d370: 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
d380: 79 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c  y column is fill
d390: 65 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e  ed with NULL sin
d3a0: 63 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a  ce its.        *
d3b0: 2a 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79  * value is alway
d3c0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68  s pulled from th
d3d0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
d3e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
d3f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d400: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
d410: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d420: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d430: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43  ddOp(v, OP_FileC
d440: 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20  olumn, i, 0);.  
d450: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d460: 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f  sqliteGenerateCo
d470: 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70  nstraintChecks(p
d480: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
d490: 30 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72  0, 0, 0, onError
d4a0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
d4b0: 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  iteCompleteInser
d4c0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
d4d0: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  b, 0, 0, 0, 0);.
d4e0: 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61      if( (db->fla
d4f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
d500: 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20  tRows)!=0 ){.   
d510: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d520: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
d530: 20 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72   1, 0);  /* Incr
d540: 65 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20  ement row count 
d550: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
d560: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d570: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
d580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d590: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d5a0: 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74   end);.    sqlit
d5b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d5c0: 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
d5d0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
d5e0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
d5f0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66  );.    if( db->f
d600: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
d610: 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20  untRows ){.     
d620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d630: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75  (v, OP_ColumnCou
d640: 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  nt, 1, 0);.     
d650: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d660: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
d670: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
d680: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
d690: 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20  P3(v, -1, "rows 
d6a0: 69 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54  inserted", P3_ST
d6b0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
d6c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d6d0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20  OP_Callback, 1, 
d6e0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
d6f0: 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20  .copy_cleanup:. 
d700: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
d710: 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61  * The non-standa
d720: 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  rd VACUUM comman
d730: 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65  d is used to cle
d740: 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61  an up the databa
d750: 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20  se,.** collapse 
d760: 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e  free space, etc.
d770: 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64    It is modelled
d780: 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55   after the VACUU
d790: 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20  M command.** in 
d7a0: 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a  PostgreSQL..**.*
d7b0: 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  * In version 1.0
d7c0: 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68  .x of SQLite, th
d7d0: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
d7e0: 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67   would call.** g
d7f0: 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29  dbm_reorganize()
d800: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61   on all the data
d810: 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75  base tables.  Bu
d820: 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77  t beginning.** w
d830: 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74  ith 2.0.0, SQLit
d840: 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
d850: 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f   GDBM so this co
d860: 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63  mmand has.** bec
d870: 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  ome a no-op..*/.
d880: 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75  void sqliteVacuu
d890: 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  m(Parse *pParse,
d8a0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
d8b0: 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  me){.  /* Do not
d8c0: 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
d8d0: 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
d8e0: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
d8f0: 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  iteBeginTransact
d900: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d910: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
d920: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
d930: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
d940: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
d950: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
d960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d970: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
d980: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
d990: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
d9a0: 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  n;.  if( db->fla
d9b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
d9c0: 61 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ans ) return;.  
d9d0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
d9e0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
d9f0: 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , 0);.  db->flag
da00: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72  s |= SQLITE_InTr
da10: 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72  ans;.  db->onErr
da20: 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  or = onError;.}.
da30: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
da40: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
da50: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
da60: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
da70: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
da80: 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28  lite *db;..  if(
da90: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
daa0: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
dab0: 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29   || db->pBe==0 )
dac0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
dad0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
dae0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
daf0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
db00: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
db10: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
db20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
db30: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
db40: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
db50: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
db60: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
db70: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
db80: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a   OE_Default;.}..
db90: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
dba0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
dbb0: 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62  void sqliteRollb
dbc0: 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
dbd0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
dbe0: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
dbf0: 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
dc00: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
dc10: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
dc20: 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72  | db->pBe==0 ) r
dc30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
dc40: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
dc50: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
dc60: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
dc70: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
dc80: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
dc90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20  0 ) return;.  v 
dca0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
dcb0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
dcc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
dcd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
dce0: 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20  llback, 0, 0);. 
dcf0: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26   }.  db->flags &
dd00: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
dd10: 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  s;.  db->onError
dd20: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d   = OE_Default;.}
dd30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
dd40: 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
dd50: 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
dd60: 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
dd70: 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
dd80: 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
dd90: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
dda0: 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
ddb0: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
ddc0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
ddd0: 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
dde0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
ddf0: 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
de00: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
de10: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
de20: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
de30: 65 74 20 69 66 20 74 68 65 20 73 65 74 43 68 65  et if the setChe
de40: 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65  ckpoint paramete
de50: 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
de60: 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
de70: 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
de80: 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
de90: 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
dea0: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
deb0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
dec0: 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
ded0: 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
dee0: 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
def0: 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
df00: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
df10: 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
df20: 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
df30: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
df40: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
df50: 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
df60: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
df70: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
df80: 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
df90: 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
dfa0: 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
dfb0: 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
dfc0: 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
dfd0: 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
dfe0: 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  id sqliteBeginWr
dff0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
e000: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
e010: 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 29 7b 0a  setCheckpoint){.
e020: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d    Vdbe *v;.  v =
e030: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
e040: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
e050: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
e060: 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  f( pParse->trigS
e070: 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f  tack ) return; /
e080: 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20  * if this is in 
e090: 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69  a trigger */.  i
e0a0: 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
e0b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
e0c0: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
e0d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e0e0: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
e0f0: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ion, 0, 0);.    
e100: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e110: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
e120: 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ie, pParse->db->
e130: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
e140: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73  );.    pParse->s
e150: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20  chemaVerified = 
e160: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  1;.  }else if( s
e170: 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a  etCheckpoint ){.
e180: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e190: 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  dOp(v, OP_Checkp
e1a0: 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  oint, 0, 0);.  }
e1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e1c0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
e1d0: 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
e1e0: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
e1f0: 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
e200: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
e210: 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20   is a companion 
e220: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69  function to Begi
e230: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
e240: 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  )..** If a trans
e250: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
e260: 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ed, then commit 
e270: 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70  it.  If a checkp
e280: 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72  oint was.** star
e290: 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ted then commit 
e2a0: 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  that..*/.void sq
e2b0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
e2c0: 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
e2d0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
e2e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74  .  if( pParse->t
e2f0: 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72  rigStack ) retur
e300: 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73  n; /* if this is
e310: 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f   in a trigger */
e320: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
e330: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e340: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
e350: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
e360: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
e370: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
e380: 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67     /* Do Nothing
e390: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
e3a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e3b0: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
e3c0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , 0);.  }.}.../*
e3d0: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
e3e0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
e3f0: 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
e400: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e410: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72   getBoolean(char
e420: 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *z){.  static c
e430: 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20  har *azTrue[] = 
e440: 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22  { "yes", "on", "
e450: 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69  true" };.  int i
e460: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20  ;.  if( z[0]==0 
e470: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e480: 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20  ( isdigit(z[0]) 
e490: 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  || (z[0]=='-' &&
e4a0: 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20   isdigit(z[1])) 
e4b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74  ){.    return at
e4c0: 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  oi(z);.  }.  for
e4d0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
e4e0: 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a  zTrue)/sizeof(az
e4f0: 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  True[0]); i++){.
e500: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
e510: 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69  rICmp(z,azTrue[i
e520: 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
e530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
e540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
e550: 73 73 20 61 20 70 72 61 67 6d 61 20 73 74 61 74  ss a pragma stat
e560: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50  ement.  .**.** P
e570: 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68  ragmas are of th
e580: 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  is form:.**.**  
e590: 20 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d 20      PRAGMA id = 
e5a0: 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  value.**.** The 
e5b0: 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74  identifier might
e5c0: 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e   also be a strin
e5d0: 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  g.  The value is
e5e0: 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a   a string, and.*
e5f0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72  * identifier, or
e600: 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d   a number.  If m
e610: 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65  inusFlag is true
e620: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
e630: 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20   is.** a number 
e640: 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65  that was precede
e650: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
e660: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
e670: 65 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70  ePragma(Parse *p
e680: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c  Parse, Token *pL
e690: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
e6a0: 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61  ht, int minusFla
e6b0: 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66  g){.  char *zLef
e6c0: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
e6d0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Right = 0;.  sql
e6e0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
e6f0: 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d  ->db;..  zLeft =
e700: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
e710: 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e  Left->z, pLeft->
e720: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
e730: 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66  ote(zLeft);.  if
e740: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
e750: 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20     zRight = 0;. 
e760: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
e770: 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22  ing(&zRight, "-"
e780: 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20  , 1, pRight->z, 
e790: 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20  pRight->n, 0);. 
e7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67   }else{.    zRig
e7b0: 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ht = sqliteStrND
e7c0: 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52  up(pRight->z, pR
e7d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  ight->n);.    sq
e7e0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67  liteDequote(zRig
e7f0: 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a  ht);.  }. .  /*.
e800: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
e810: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
e820: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
e830: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d  ault_cache_size=
e840: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
e850: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
e860: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ts the current p
e870: 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e  ersistent settin
e880: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
e890: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
e8a0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
e8b0: 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ned is the maxim
e8c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
e8d0: 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  * pages in the p
e8e0: 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  age cache.  The 
e8f0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
e900: 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e   both the curren
e910: 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  t.  ** page cach
e920: 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64  e size value and
e930: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
e940: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
e950: 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65  value.  ** store
e960: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
e970: 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e file..  **.  *
e980: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 61  * The default ca
e990: 63 68 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72  che size is stor
e9a0: 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65  ed in meta-value
e9b0: 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20   2 of page 1 of 
e9c0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e9d0: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63  e file.  The cac
e9e0: 68 65 20 73 69 7a 65 20 69 73 20 61 63 74 75 61  he size is actua
e9f0: 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65  lly the absolute
ea00: 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74   value of.  ** t
ea10: 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  his memory locat
ea20: 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f  ion.  The sign o
ea30: 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64  f meta-value 2 d
ea40: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20  etermines the.  
ea50: 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  ** synchronous s
ea60: 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74  etting.  A negat
ea70: 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20  ive value means 
ea80: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
ea90: 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f  ff.  ** and a po
eaa0: 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61  sitive value mea
eab0: 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ns synchronous i
eac0: 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s on..  */.  if(
ead0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
eae0: 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 63 61  Left,"default_ca
eaf0: 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  che_size")==0 ){
eb00: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
eb10: 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  Op getCacheSize[
eb20: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
eb30: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c  _ReadCookie,  0,
eb40: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
eb50: 20 20 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c       { OP_AbsVal
eb60: 75 65 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  ue,    0, 0,    
eb70: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
eb80: 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20  OP_Dup,         
eb90: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
eba0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
ebb0: 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
ebc0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
ebd0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
ebe0: 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30    0, 6,        0
ebf0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
ec00: 74 65 67 65 72 2c 20 20 20 20 20 4d 41 58 5f 50  teger,     MAX_P
ec10: 41 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20  AGES,0, 0},.    
ec20: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
ec30: 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20  nt, 1, 0,       
ec40: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ec50: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
ec60: 30 2c 20 20 20 20 20 20 20 20 22 63 61 63 68 65  0,        "cache
ec70: 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b  _size"},.      {
ec80: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
ec90: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
eca0: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
ecb0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
ecc0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ecd0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
ece0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69  urn;.    if( pRi
ecf0: 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
ed00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ed10: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
ed20: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61   ArraySize(getCa
ed30: 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63  cheSize), getCac
ed40: 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  heSize);.    }el
ed50: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  se{.      int ad
ed60: 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  dr;.      int si
ed70: 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74  ze = atoi(zRight
ed80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
ed90: 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  e<0 ) size = -si
eda0: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
edb0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
edc0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ion(pParse, 0);.
edd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ede0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
edf0: 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20  ger, size, 0);. 
ee00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ee10: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43  ddOp(v, OP_ReadC
ee20: 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20  ookie, 0, 2);.  
ee30: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ee40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ee50: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
ee60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ee70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c  eAddOp(v, OP_Ge,
ee80: 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20   0, addr+3);.   
ee90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
eea0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
eeb0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
eec0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
eed0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
eee0: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
eef0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
ef00: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
ef10: 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
ef20: 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f  ize = db->cache_
ef30: 73 69 7a 65 3c 30 20 3f 20 2d 73 69 7a 65 20 3a  size<0 ? -size :
ef40: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
ef50: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
ef60: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62  Size(db->pBe, db
ef70: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
ef80: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
ef90: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
efa0: 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  cache_size.  ** 
efb0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
efc0: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
efd0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
efe0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
eff0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
f000: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
f010: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54  e cache size.  T
f020: 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67  he local setting
f030: 20 63 61 6e 20 62 65 20 64 69 66 66 65 72 65 6e   can be differen
f040: 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  t from.  ** the 
f050: 70 65 72 73 69 73 74 65 6e 74 20 63 61 63 68 65  persistent cache
f060: 20 73 69 7a 65 20 76 61 6c 75 65 20 74 68 61 74   size value that
f070: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
f080: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
f090: 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 20 54 68  file itself.  Th
f0a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
f0b0: 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
f0c0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70  number of.  ** p
f0d0: 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
f0e0: 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63   cache.  The sec
f0f0: 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68  ond form sets th
f100: 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67  e local.  ** pag
f110: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
f120: 75 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ue.  It does not
f130: 20 63 68 61 6e 67 65 20 74 68 65 20 70 65 72 73   change the pers
f140: 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68  istent.  ** cach
f150: 65 20 73 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e  e size stored on
f160: 20 74 68 65 20 64 69 73 6b 20 73 6f 20 74 68 65   the disk so the
f170: 20 63 61 63 68 65 20 73 69 7a 65 20 77 69 6c 6c   cache size will
f180: 20 72 65 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20   revert.  ** to 
f190: 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c 75  its default valu
f1a0: 65 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  e when the datab
f1b0: 61 73 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ase is closed an
f1c0: 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a  d reopened..  **
f1d0: 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70   N should be a p
f1e0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e  ositive integer.
f1f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
f200: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
f210: 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30  "cache_size")==0
f220: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
f230: 64 62 65 4f 70 20 67 65 74 43 61 63 68 65 53 69  dbeOp getCacheSi
f240: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
f250: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
f260: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
f270: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
f280: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
f290: 20 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69         "cache_si
f2a0: 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  ze"},.      { OP
f2b0: 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
f2c0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
f2d0: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
f2e0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
f2f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f300: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
f310: 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
f320: 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
f330: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
f340: 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
f350: 3b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  ;;.      if( siz
f360: 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  e<0 ) size = -si
f370: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
f380: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f390: 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 30  Integer, size, 0
f3a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f3b0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
f3c0: 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63  ArraySize(getCac
f3d0: 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68  heSize), getCach
f3e0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  eSize);.    }els
f3f0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
f400: 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29  e = atoi(zRight)
f410: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
f420: 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
f430: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  e;.      if( db-
f440: 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 29 20  >cache_size<0 ) 
f450: 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
f460: 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69      db->cache_si
f470: 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  ze = size;.     
f480: 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43   sqliteBtreeSetC
f490: 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65  acheSize(db->pBe
f4a0: 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
f4b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f4c0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
f4d0: 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63  GMA default_sync
f4e0: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52  hronous.  **  PR
f4f0: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e  AGMA default_syn
f500: 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e  chronous=BOOLEAN
f510: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
f520: 69 72 73 74 20 66 6f 72 6d 20 72 65 74 75 72 6e  irst form return
f530: 73 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  s the persistent
f540: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 73   value of the "s
f550: 79 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65 74 74  ynchronous" sett
f560: 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ing.  ** that is
f570: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
f580: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
f590: 73 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  s the synchronou
f5a0: 73 20 73 65 74 74 69 6e 67 20 74 68 61 74 0a 20  s setting that. 
f5b0: 20 2a 2a 20 69 73 20 75 73 65 64 20 77 68 65 6e   ** is used when
f5c0: 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
f5d0: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65  e is opened unle
f5e0: 73 73 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  ss overridden by
f5f0: 20 61 20 73 65 70 61 72 61 74 65 0a 20 20 2a 2a   a separate.  **
f600: 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70   "synchronous" p
f610: 72 61 67 6d 61 2e 20 20 54 68 65 20 73 65 63 6f  ragma.  The seco
f620: 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20  nd form changes 
f630: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 61  the persistent a
f640: 6e 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61  nd the.  ** loca
f650: 6c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65  l synchronous se
f660: 74 74 69 6e 67 20 74 6f 20 74 68 65 20 76 61 6c  tting to the val
f670: 75 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20  ue given..  **. 
f680: 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f   ** If synchrono
f690: 75 73 20 69 73 20 6f 6e 2c 20 53 51 4c 69 74 65  us is on, SQLite
f6a0: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e   will do an fsyn
f6b0: 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
f6c0: 61 74 20 73 74 72 61 74 65 67 69 63 0a 20 20 2a  at strategic.  *
f6d0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 69 6e 73 75  * points to insu
f6e0: 72 65 20 74 68 61 74 20 61 6c 6c 20 70 72 65 76  re that all prev
f6f0: 69 6f 75 73 6c 79 20 77 72 69 74 74 65 6e 20 64  iously written d
f700: 61 74 61 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ata has actually
f710: 20 62 65 65 6e 0a 20 20 2a 2a 20 77 72 69 74 74   been.  ** writt
f720: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
f730: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 20   surface before 
f740: 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 68 69  continuing.  Thi
f750: 73 20 6d 6f 64 65 20 69 6e 73 75 72 65 73 20 74  s mode insures t
f760: 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  hat.  ** the dat
f770: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 77 61 79  abase will alway
f780: 73 20 62 65 20 69 6e 20 61 20 63 6f 6e 73 69 73  s be in a consis
f790: 74 65 6e 74 20 73 74 61 74 65 20 65 76 65 6e 74  tent state event
f7a0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
f7b0: 67 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72  g.  ** system cr
f7c0: 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 74  ashes or power t
f7d0: 6f 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 69  o the computer i
f7e0: 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 75 6e  s interrupted un
f7f0: 65 78 70 65 63 74 65 64 6c 79 2e 0a 20 20 2a 2a  expectedly..  **
f800: 20 57 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   When synchronou
f810: 73 20 69 73 20 6f 66 66 2c 20 53 51 4c 69 74 65  s is off, SQLite
f820: 20 77 69 6c 6c 20 6e 6f 74 20 77 61 69 74 20 66   will not wait f
f830: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 61 63  or changes to ac
f840: 74 75 61 6c 6c 79 0a 20 20 2a 2a 20 62 65 20 77  tually.  ** be w
f850: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
f860: 73 6b 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  sk before contin
f870: 75 69 6e 67 2e 20 20 41 73 20 73 6f 6f 6e 20 61  uing.  As soon a
f880: 73 20 69 74 20 68 61 6e 64 73 20 63 68 61 6e 67  s it hands chang
f890: 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f  es.  ** to the o
f8a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
f8b0: 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
f8c0: 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65   the changes are
f8d0: 20 70 65 72 6d 61 6e 65 6e 74 20 61 6e 64 0a 20   permanent and. 
f8e0: 20 2a 2a 20 69 74 20 63 6f 6e 74 69 6e 75 65 73   ** it continues
f8f0: 20 67 6f 69 6e 67 2e 20 20 54 68 65 20 64 61 74   going.  The dat
f900: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
f910: 63 6f 72 72 75 70 74 65 64 20 62 79 20 61 20 70  corrupted by a p
f920: 72 6f 67 72 61 6d 20 63 72 61 73 68 0a 20 20 2a  rogram crash.  *
f930: 2a 20 65 76 65 6e 20 77 69 74 68 20 73 79 6e 63  * even with sync
f940: 68 72 6f 6e 6f 75 73 20 6f 66 66 2c 20 62 75 74  hronous off, but
f950: 20 61 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79   an operating sy
f960: 73 74 65 6d 20 63 72 61 73 68 20 6f 72 20 70 6f  stem crash or po
f970: 77 65 72 20 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f  wer loss.  ** co
f980: 75 6c 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  uld potentially 
f990: 63 6f 72 72 75 70 74 20 64 61 74 61 2e 20 20 4f  corrupt data.  O
f9a0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
f9b0: 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 66  , synchronous of
f9c0: 66 20 69 73 0a 20 20 2a 2a 20 66 61 73 74 65 72  f is.  ** faster
f9d0: 20 74 68 61 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   than synchronou
f9e0: 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s on..  */.  if(
f9f0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
fa00: 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 73 79  Left,"default_sy
fa10: 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29  nchronous")==0 )
fa20: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
fa30: 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20  eOp getSync[] = 
fa40: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  {.      { OP_Int
fa50: 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20  eger,     0, 0, 
fa60: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
fa70: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
fa80: 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20  ,  0, 2,        
fa90: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
faa0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30  nteger,     0, 0
fab0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
fac0: 20 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20     { OP_Lt,     
fad0: 20 20 20 20 20 30 2c 20 35 2c 20 20 20 20 20 20       0, 5,      
fae0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
faf0: 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c  _AddImm,      1,
fb00: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
fb10: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
fb20: 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20  Count, 1, 0,    
fb30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
fb40: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
fb50: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 73 79  0, 0,        "sy
fb60: 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20  nchronous"},.   
fb70: 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
fb80: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
fb90: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
fba0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
fbb0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
fbc0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
fbd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
fbe0: 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
fbf0: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  t->z ){.      sq
fc00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
fc10: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
fc20: 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e 63  etSync), getSync
fc30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fc40: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
fc50: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
fc60: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20  b->cache_size;. 
fc70: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
fc80: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
fc90: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
fca0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
fcb0: 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
fcc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fcd0: 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  p(v, OP_ReadCook
fce0: 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  ie, 0, 2);.     
fcf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fd00: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
fd10: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
fd20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fd30: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
fd40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fd50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fd60: 50 5f 4e 65 2c 20 30 2c 20 61 64 64 72 2b 33 29  P_Ne, 0, addr+3)
fd70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
fd80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
fd90: 64 49 6d 6d 2c 20 4d 41 58 5f 50 41 47 45 53 2c  dImm, MAX_PAGES,
fda0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
fdb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fdc0: 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29  _AbsValue, 0, 0)
fdd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67 65 74  ;.      if( !get
fde0: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
fdf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
fe00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fe10: 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29  _Negative, 0, 0)
fe20: 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65 20 3d  ;.        size =
fe30: 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a   -size;.      }.
fe40: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
fe50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
fe60: 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20  ookie, 0, 2);.  
fe70: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
fe80: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
fe90: 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  se);.      db->c
fea0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
feb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
fec0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
fed0: 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63  db->pBe, db->cac
fee0: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
fef0: 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
ff00: 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  **   PRAGMA sync
ff10: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50  hronous.  **   P
ff20: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
ff30: 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20  s=BOOLEAN.  **. 
ff40: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
ff50: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
ff60: 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f  e of the synchro
ff70: 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e  nous flag.  Chan
ff80: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f  ging.  ** the lo
ff90: 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e  cal value does n
ffa0: 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20  ot make changes 
ffb0: 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  to the disk file
ffc0: 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65   and the.  ** de
ffd0: 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
ffe0: 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65   be restored the
fff0: 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64   next time the d
10000 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20  atabase is.  ** 
10010 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
10020 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
10030 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68 72 6f 6e  (zLeft,"synchron
10040 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ous")==0 ){.    
10050 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65  static VdbeOp ge
10060 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20  tSync[] = {.    
10070 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
10080 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20  nt, 1, 0,       
10090 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
100a0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
100b0 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68  0,        "synch
100c0 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20  ronous"},.      
100d0 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
100e0 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
100f0 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
10100 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
10110 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10120 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
10130 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52  turn;.    if( pR
10140 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e  ight->z==pLeft->
10150 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
10160 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10170 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 63 61  _Integer, db->ca
10180 63 68 65 5f 73 69 7a 65 3e 3d 30 2c 20 30 29 3b  che_size>=0, 0);
10190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
101a0 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
101b0 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29  raySize(getSync)
101c0 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20  , getSync);.    
101d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
101e0 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68   size = db->cach
101f0 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  e_size;.      if
10200 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  ( size<0 ) size 
10210 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  = -size;.      i
10220 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  f( !getBoolean(z
10230 52 69 67 68 74 29 20 29 20 73 69 7a 65 20 3d 20  Right) ) size = 
10240 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d  -size;.      db-
10250 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
10260 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
10270 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
10280 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63  e(db->pBe, db->c
10290 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
102a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
102b0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
102c0 4c 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f 6f  Left, "trigger_o
102d0 76 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d 3d  verhead_test")==
102e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
102f0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
10300 29 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f  ){.      always_
10310 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74  code_trigger_set
10320 75 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  up = 1;.    }els
10330 65 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f  e{.      always_
10340 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74  code_trigger_set
10350 75 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  up = 0;.    }.  
10360 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
10370 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
10380 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d  , "vdbe_trace")=
10390 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
103a0 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
103b0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
103c0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64  ags |= SQLITE_Vd
103d0 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c  beTrace;.    }el
103e0 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
103f0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56  ags &= ~SQLITE_V
10400 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a  dbeTrace;.    }.
10410 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
10420 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10430 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  ft, "full_column
10440 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20  _names")==0 ){. 
10450 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
10460 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
10470 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
10480 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
10490 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mes;.    }else{.
104a0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
104b0 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
104c0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20  olNames;.    }. 
104d0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
104e0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
104f0 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74 5f 64  t, "result_set_d
10500 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a 20  etails")==0 ){. 
10510 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
10520 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
10530 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
10540 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74  SQLITE_ResultDet
10550 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ails;.    }else{
10560 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
10570 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73 75   &= ~SQLITE_Resu
10580 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d  ltDetails;.    }
10590 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
105a0 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
105b0 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61 6e  eft, "count_chan
105c0 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ges")==0 ){.    
105d0 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
105e0 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
105f0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10600 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20  ITE_CountRows;. 
10610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10620 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
10630 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a  LITE_CountRows;.
10640 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
10650 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10660 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74 79  mp(zLeft, "empty
10670 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b  _result_callback
10680 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
10690 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
106a0 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
106b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
106c0 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a  E_NullCallback;.
106d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
106e0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
106f0 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
10700 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ck;.    }.  }els
10710 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
10720 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74  trICmp(zLeft, "t
10730 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29  able_info")==0 )
10740 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
10750 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  b;.    Vdbe *v;.
10760 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
10770 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
10780 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
10790 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69 74  pTab ) v = sqlit
107a0 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
107b0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26  ;.    if( pTab &
107c0 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61  & v ){.      sta
107d0 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65  tic VdbeOp table
107e0 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20  InfoPreface[] = 
107f0 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  {.        { OP_C
10800 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20 30  olumnCount, 5, 0
10810 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
10820 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
10830 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
10840 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20    "cid"},.      
10850 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10860 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
10870 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20  "name"},.       
10880 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
10890 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  2, 0,       "
108a0 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  type"},.        
108b0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
108c0 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    3, 0,       "n
108d0 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20  otnull"},.      
108e0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
108f0 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20  e,  4, 0,       
10900 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20  "dflt_value"},. 
10910 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
10920 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
10930 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
10940 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
10950 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
10960 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
10970 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69  ;.      sqliteVi
10980 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
10990 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
109a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
109b0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
109c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
109d0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
109e0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
109f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10a00 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
10a10 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
10a20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10a30 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10a40 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
10a50 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
10a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10a70 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
10a80 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
10a90 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10aa0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10ab0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
10ac0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
10ad0 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  ? pTab->aCol[i].
10ae0 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c 20  zType : "text", 
10af0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10b00 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10b10 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10b20 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  r, pTab->aCol[i]
10b30 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20  .notNull, 0);.  
10b40 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10b50 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
10b60 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
10b70 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
10b80 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
10b90 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  b->aCol[i].zDflt
10ba0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10bb0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10bc0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
10bd0 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20 20  back, 5, 0);.   
10be0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
10bf0 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
10c00 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
10c10 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20  index_info")==0 
10c20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
10c30 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
10c40 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
10c50 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c  ;.    pIdx = sql
10c60 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
10c70 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
10c80 28 20 70 49 64 78 20 29 20 76 20 3d 20 73 71 6c  ( pIdx ) v = sql
10c90 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
10ca0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  e);.    if( pIdx
10cb0 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73   && v ){.      s
10cc0 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62  tatic VdbeOp tab
10cd0 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20  leInfoPreface[] 
10ce0 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
10cf0 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c  _ColumnCount, 3,
10d00 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
10d10 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10d20 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
10d30 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20      "seqno"},.  
10d40 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10d50 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
10d60 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
10d70 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
10d80 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20  ame,  2, 0,     
10d90 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
10da0 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
10db0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49  .      pTab = pI
10dc0 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  dx->pTable;.    
10dd0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10de0 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
10df0 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
10e00 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
10e10 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66  reface);.      f
10e20 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
10e30 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
10e40 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20         int cnum 
10e50 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
10e60 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
10e70 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10e80 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
10e90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10ea0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10eb0 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20  _Integer, cnum, 
10ec0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10ed0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10ee0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
10ef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10f00 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d   pTab->nCol>cnum
10f10 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
10f20 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
10f30 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
10f40 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33  [cnum].zName, P3
10f50 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10f60 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10f70 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
10f80 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 3, 0);.      }
10f90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
10fa0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
10fb0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
10fc0 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20  x_list")==0 ){. 
10fd0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
10fe0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
10ff0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
11000 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
11010 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
11020 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ght);.    if( pT
11030 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ab ){.      v = 
11040 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
11050 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64  arse);.      pId
11060 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  x = pTab->pIndex
11070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11080 70 54 61 62 20 26 26 20 70 49 64 78 20 26 26 20  pTab && pIdx && 
11090 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  v ){.      int i
110a0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74 61   = 0; .      sta
110b0 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78  tic VdbeOp index
110c0 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20  ListPreface[] = 
110d0 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  {.        { OP_C
110e0 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30  olumnCount, 3, 0
110f0 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
11100 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11110 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
11120 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20    "seq"},.      
11130 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11140 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
11150 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20  "name"},.       
11160 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
11170 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  2, 0,       "
11180 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20  unique"},.      
11190 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  };..      sqlite
111a0 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
111b0 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78   ArraySize(index
111c0 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e  ListPreface), in
111d0 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b  dexListPreface);
111e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64  .      while(pId
111f0 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  x){.        sqli
11200 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11210 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
11220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11230 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11240 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
11250 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
11260 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
11270 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pIdx->zName, P3
11280 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
11290 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
112a0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
112b0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
112c0 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20  OE_None, 0);.   
112d0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
112e0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
112f0 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20  ack, 3, 0);.    
11300 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20      ++i;.       
11310 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e   pIdx = pIdx->pN
11320 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
11330 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
11340 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28  def NDEBUG.  if(
11350 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11360 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72  Left, "parser_tr
11370 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ace")==0 ){.    
11380 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
11390 74 65 50 61 72 73 65 72 54 72 61 63 65 28 46 49  teParserTrace(FI
113a0 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20  LE*, char *);.  
113b0 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
113c0 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
113d0 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72    sqliteParserTr
113e0 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72  ace(stdout, "par
113f0 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ser: ");.    }el
11400 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
11410 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30  ParserTrace(0, 0
11420 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
11430 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
11440 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
11450 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f 63  ft, "integrity_c
11460 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  heck")==0 ){.   
11470 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 63   static VdbeOp c
11480 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20 20  heckDb[] = {.   
11490 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72     { OP_SetInser
114a0 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  t,   0, 0,      
114b0 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20    "2"},.      { 
114c0 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  OP_Open,        
114d0 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
114e0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
114f0 6e 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20 20  nd,      0, 6,  
11500 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11510 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
11520 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
11530 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  },.      { OP_Se
11540 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c  tInsert,   0, 0,
11550 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
11560 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
11570 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
11580 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11590 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30 2c 20  IntegrityCk, 0, 
115a0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
115b0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
115c0 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
115d0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
115e0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
115f0 2c 20 30 2c 20 20 20 20 20 20 20 20 22 69 6e 74  , 0,        "int
11600 65 67 72 69 74 79 5f 63 68 65 63 6b 22 7d 2c 0a  egrity_check"},.
11610 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
11620 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
11630 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
11640 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
11650 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
11660 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
11670 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
11680 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
11690 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
116a0 28 63 68 65 63 6b 44 62 29 2c 20 63 68 65 63 6b  (checkDb), check
116b0 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  Db);.  }else..  
116c0 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  {}.  sqliteFree(
116d0 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  zLeft);.  sqlite
116e0 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a  Free(zRight);.}.