/ Hex Artifact Content
Login

Artifact 74f19f9001ee3708b451faf8fc8a6b36024a9be7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 38 39 20 32 30 30  ild.c,v 1.89 200
0310: 32 2f 30 35 2f 31 35 20 31 31 3a 34 34 3a 31 34  2/05/15 11:44:14
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 20 28 70  rop);.  while (p
2160: 45 6c 65 6d 29 20 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 20 7b 0a 20 20 20 20 54 72 69 67 67 65  0)) {.    Trigge
2a80: 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71  r *pTrigger = sq
2a90: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2aa0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  em);.    if( !pT
2ab0: 72 69 67 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74  rigger->isCommit
2ac0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
2ad0: 2a 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46 69  *pTbl = sqliteFi
2ae0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72 69  ndTable(db, pTri
2af0: 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20  gger->table);.  
2b00: 20 20 20 20 69 66 28 20 70 54 62 6c 20 29 7b 0a      if( pTbl ){.
2b10: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 62 6c          if( pTbl
2b20: 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54  ->pTrigger == pT
2b30: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
2b40: 20 20 20 20 70 54 62 6c 2d 3e 70 54 72 69 67 67      pTbl->pTrigg
2b50: 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
2b60: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Next;.        }e
2b70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54  lse{.          T
2b80: 72 69 67 67 65 72 20 2a 63 63 20 3d 20 70 54 62  rigger *cc = pTb
2b90: 6c 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  l->pTrigger;.   
2ba0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 63         while( cc
2bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bc0: 69 66 20 28 63 63 2d 3e 70 4e 65 78 74 20 3d 3d  if (cc->pNext ==
2bd0: 20 70 54 72 69 67 67 65 72 29 20 7b 0a 20 20 20   pTrigger) {.   
2be0: 20 20 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70             cc->p
2bf0: 4e 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74  Next = cc->pNext
2c00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
2c10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c30: 20 20 20 20 20 20 20 20 63 63 20 3d 20 63 63 2d          cc = cc-
2c40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
2c50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
2c60: 73 65 72 74 28 63 63 29 3b 0a 20 20 20 20 20 20  sert(cc);.      
2c70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c80: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
2c90: 72 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68  rt(&db->trigHash
2ca0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  , pTrigger->name
2cb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2cc0: 31 20 2b 20 73 74 72 6c 65 6e 28 70 54 72 69 67  1 + strlen(pTrig
2cd0: 67 65 72 2d 3e 6e 61 6d 65 29 2c 20 30 29 3b 0a  ger->name), 0);.
2ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
2cf0: 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67  teTrigger(pTrigg
2d00: 65 72 29 3b 0a 20 20 20 20 20 20 70 45 6c 65 6d  er);.      pElem
2d10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72   = sqliteHashFir
2d20: 73 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68  st(&db->trigHash
2d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2d40: 2f 2a 20 41 6e 79 20 74 72 69 67 67 65 72 73 20  /* Any triggers 
2d50: 74 68 61 74 20 77 65 72 65 20 64 72 6f 70 70 65  that were droppe
2d60: 64 20 2d 20 70 75 74 20 27 65 6d 20 62 61 63 6b  d - put 'em back
2d70: 20 69 6e 20 70 6c 61 63 65 20 2a 2f 0a 20 20 66   in place */.  f
2d80: 6f 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74  or(pElem = sqlit
2d90: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
2da0: 74 72 69 67 44 72 6f 70 29 3b 20 70 45 6c 65 6d  trigDrop); pElem
2db0: 3b 20 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d  ; .      pElem =
2dc0: 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28   sqliteHashNext(
2dd0: 70 45 6c 65 6d 29 29 20 7b 0a 20 20 20 20 54 72  pElem)) {.    Tr
2de0: 69 67 67 65 72 20 2a 20 70 54 72 69 67 67 65 72  igger * pTrigger
2df0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2e00: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 54 61  a(pElem);.    Ta
2e10: 62 6c 65 20 2a 20 74 61 62 20 3d 20 73 71 6c 69  ble * tab = sqli
2e20: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
2e30: 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29  pTrigger->table)
2e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
2e50: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 72 69 67  Insert(&db->trig
2e60: 48 61 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e  Hash, pTrigger->
2e70: 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 73  name, .        s
2e80: 74 72 6c 65 6e 28 70 54 72 69 67 67 65 72 2d 3e  trlen(pTrigger->
2e90: 6e 61 6d 65 29 20 2b 20 31 2c 20 70 54 72 69 67  name) + 1, pTrig
2ea0: 67 65 72 29 3b 0a 0a 20 20 20 20 70 54 72 69 67  ger);..    pTrig
2eb0: 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 74 61 62  ger->pNext = tab
2ec0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
2ed0: 74 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20  tab->pTrigger = 
2ee0: 70 54 72 69 67 67 65 72 3b 0a 20 20 7d 0a 0a 20  pTrigger;.  }.. 
2ef0: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
2f00: 28 26 64 62 2d 3e 74 72 69 67 44 72 6f 70 29 3b  (&db->trigDrop);
2f10: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
2f20: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2f30: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2f40: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61  Construct the na
2f50: 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62  me of a user tab
2f60: 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d  le or index from
2f70: 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20   a token..**.** 
2f80: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
2f90: 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e  e name is obtain
2fa0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
2fb0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a  lloc() and must.
2fc0: 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74  ** be freed by t
2fd0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2fe0: 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ion..*/.char *sq
2ff0: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
3000: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
3010: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
3020: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
3030: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
3040: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74  ame->n);.  sqlit
3050: 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  eDequote(zName);
3060: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
3080: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
3090: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
30a0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
30b0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
30c0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
30d0: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
30e0: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
30f0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
3100: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
3110: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3120: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
3130: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
3140: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
3150: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
3160: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
3170: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
3180: 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70   name.  The.** p
3190: 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74  Start token is t
31a0: 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e  he CREATE and pN
31b0: 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65  ame is the table
31c0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65   name.  The isTe
31d0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
31e0: 75 65 20 69 66 20 74 68 65 20 22 54 45 4d 50 22  ue if the "TEMP"
31f0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
3200: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
3210: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
3220: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
3230: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
3240: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
3250: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
3260: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
3270: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
3280: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
3290: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
32a0: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
32b0: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
32c0: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
32d0: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
32e0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
32f0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
3300: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
3310: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
3320: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
3330: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
3340: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
3350: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
3360: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
3370: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
3380: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
3390: 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74  void sqliteStart
33a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
33b0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61  rse, Token *pSta
33c0: 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  rt, Token *pName
33d0: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
33e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
33f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
3400: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
3410: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
3420: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
3430: 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73  *v;..  pParse->s
3440: 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53  FirstToken = *pS
3450: 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  tart;.  zName = 
3460: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
3470: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
3480: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3490: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
34a0: 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f  Before trying to
34b0: 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   create a tempor
34c0: 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20  ary table, make 
34d0: 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66  sure the Btree f
34e0: 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20  or.  ** holding 
34f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3500: 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   is open..  */. 
3510: 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64   if( isTemp && d
3520: 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b  b->pBeTemp==0 ){
3530: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
3540: 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c  liteBtreeOpen(0,
3550: 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
3560: 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20  db->pBeTemp);.  
3570: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3580: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
3590: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
35a0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
35b0: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
35c0: 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
35d0: 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
35e0: 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
35f0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3600: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  s", 0);.      pP
3610: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3620: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3630: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  }.    if( db->fl
3640: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
3650: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63  rans ){.      rc
3660: 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42 65   = sqliteBtreeBe
3670: 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65  ginTrans(db->pBe
3680: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Temp);.      if(
3690: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36b0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
36c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
36d0: 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
36e0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
36f0: 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
3700: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
3710: 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  file", 0);.     
3720: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3730: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
3740: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
3750: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
3760: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
3770: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
3780: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
3790: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
37a0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
37b0: 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  me.  Issue an er
37c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69  ror message if i
37d0: 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t does..  **.  *
37e0: 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72  * If we are re-r
37f0: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
3800: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
3810: 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65  ecause of a sche
3820: 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61  ma.  ** change a
3830: 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65  nd a new permane
3840: 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e  nt table is foun
3850: 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c  d whose name col
3860: 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20  lides with.  ** 
3870: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70  an existing temp
3880: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
3890: 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e 65 77  n ignore the new
38a0: 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65   permanent table
38b0: 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63  ..  ** We will c
38c0: 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67 2c  ontinue parsing,
38d0: 20 62 75 74 20 74 68 65 20 70 50 61 72 73 65 2d   but the pParse-
38e0: 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61 67 20  >nameClash flag 
38f0: 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a  will be set.  **
3900: 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77   so we will know
3910: 20 74 6f 20 64 69 73 63 61 72 64 20 74 68 65 20   to discard the 
3920: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63  table record onc
3930: 65 20 70 61 72 73 69 6e 67 20 68 61 73 20 66 69  e parsing has fi
3940: 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  nished..  */.  p
3950: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69  Table = sqliteFi
3960: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
3970: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  e);.  if( pTable
3980: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
3990: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26  Table->isTemp &&
39a0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
39b0: 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  g ){.      pPars
39c0: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31  e->nameClash = 1
39d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
39e0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
39f0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
3a00: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
3a10: 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  0, pName->z, pNa
3a20: 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20  me->n,.         
3a30: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
3a40: 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  s", 0, 0);.     
3a50: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
3a60: 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  e);.      pParse
3a70: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3a80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
3aa0: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30  e->nameClash = 0
3ab0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64  ;.  }.  if( (pId
3ac0: 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
3ad0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  dex(db, zName))!
3ae0: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
3af0: 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  (!pIdx->pTable->
3b00: 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72 73  isTemp || !pPars
3b10: 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a  e->initFlag) ){.
3b20: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
3b30: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
3b40: 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20  rMsg, "there is 
3b50: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
3b60: 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20   named ", .     
3b70: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
3b80: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
3b90: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
3ba0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
3bb0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
3bc0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3bd0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
3be0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
3bf0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
3c00: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
3c10: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
3c20: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
3c30: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ame;.  pTable->n
3c40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
3c50: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
3c60: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
3c70: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e  1;.  pTable->pIn
3c80: 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  dex = 0;.  pTabl
3c90: 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73 54 65  e->isTemp = isTe
3ca0: 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  mp;.  if( pParse
3cb0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71  ->pNewTable ) sq
3cc0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
3cd0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
3ce0: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
3cf0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
3d00: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  able;..  /* Begi
3d10: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
3d20: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3d30: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
3d40: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
3d50: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
3d60: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
3d70: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
3d80: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
3d90: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
3da0: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
3db0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
3dc0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
3dd0: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
3de0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
3df0: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
3e00: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
3e10: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
3e20: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
3e30: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
3e40: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
3e50: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
3e60: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
3e70: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
3e80: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
3e90: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
3ea0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
3eb0: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
3ec0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
3ed0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
3ee0: 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   (v = sqliteGetV
3ef0: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
3f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67  ){.    sqliteBeg
3f10: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
3f20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
3f30: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
3f40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f50: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
3f60: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
3f70: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
3f80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3f90: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
3fa0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
3fb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3fc0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32  _OpenWrite, 0, 2
3fd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3fe0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3ff0: 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  1, MASTER_NAME, 
4000: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
4010: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4020: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4030: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4040: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4050: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
4060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4070: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
4080: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
4090: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
40a0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
40b0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  y, 0, 0);.    }.
40c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
40d0: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
40e0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
40f0: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
4100: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
4110: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
4120: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
4130: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4140: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
4150: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
4160: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
4170: 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 29  liteStartTable()
4180: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
4190: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
41a0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
41b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
41c0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
41d0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
41e0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
41f0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
4200: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
4210: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4220: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
4230: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4240: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4250: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e  turn;.  if( (p->
4260: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
4270: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
4280: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
4290: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
42a0: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
42b0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
42c0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
42d0: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
42e0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
42f0: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  aNew;.  }.  mems
4300: 65 74 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  et(&p->aCol[p->n
4310: 43 6f 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Col], 0, sizeof(
4320: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
4330: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  pz = &p->aCol[p-
4340: 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol++].zName;.
4350: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
4360: 6e 67 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  ng(pz, pName->z,
4370: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
4380: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
4390: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pz);.}../*.** Th
43a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
43b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
43c0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
43d0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
43e0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
43f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4400: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
4410: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
4420: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
4430: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
4440: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
4450: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
4460: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
4470: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
4480: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4490: 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c   sqliteAddNotNul
44a0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
44b0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
44c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
44d0: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
44e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
44f0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
4500: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
4510: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
4520: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
4530: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
4540: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4550: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
4560: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
4570: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
4580: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
4590: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
45a0: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
45b0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
45c0: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
45d0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
45e0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
45f0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
4600: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
4610: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
4620: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
4630: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
4640: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
4650: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
4660: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
4670: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
4680: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
4690: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
46a0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
46b0: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
46c0: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
46d0: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
46e0: 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79  qliteAddColumnTy
46f0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
4700: 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  , Token *pFirst,
4710: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a   Token *pLast){.
4720: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
4730: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b  t i, j;.  int n;
4740: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a  .  char *z, **pz
4750: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
4760: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
4770: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
4780: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
4790: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
47a0: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
47b0: 6c 5b 69 5d 2e 7a 54 79 70 65 3b 0a 20 20 6e 20  l[i].zType;.  n 
47c0: 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64  = pLast->n + Add
47d0: 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64  r(pLast->z) - Ad
47e0: 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20  dr(pFirst->z);. 
47f0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4800: 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c  g(pz, pFirst->z,
4810: 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70   n, 0);.  z = *p
4820: 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  z;.  if( z==0 ) 
4830: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
4840: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
4850: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69  .    int c = z[i
4860: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  ];.    if( isspa
4870: 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65  ce(c) ) continue
4880: 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63  ;.    z[j++] = c
4890: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  ;.}../*.** The g
48b0: 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68  iven token is th
48c0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
48d0: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  for the last col
48e0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  umn added to.** 
48f0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
4900: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
4910: 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e  uction.  If "min
4920: 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c  usFlag" is true,
4930: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
4940: 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73   value token was
4950: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
4960: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
4970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4980: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
4990: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
49a0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
49b0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
49c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
49d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
49e0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
49f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4a00: 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20  oken *pVal, int 
4a10: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61  minusFlag){.  Ta
4a20: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
4a30: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20  .  char **pz;.  
4a40: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
4a50: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
4a60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
4a70: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
4a80: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
4a90: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
4aa0: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
4ab0: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
4ac0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
4ad0: 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c  pz, "-", 1, pVal
4ae0: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
4af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
4b00: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
4b10: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
4b20: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
4b30: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
4b40: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
4b50: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
4b60: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
4b70: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
4b80: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
4b90: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
4ba0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
4bb0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
4bc0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
4bd0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
4be0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
4bf0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
4c00: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
4c10: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
4c20: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
4c30: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
4c40: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
4c50: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
4c60: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
4c70: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
4c80: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
4c90: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
4ca0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
4cb0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
4cc0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
4cd0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
4ce0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
4cf0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
4d00: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
4d10: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
4d20: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
4d30: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
4d40: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
4d50: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
4d60: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
4d70: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
4d80: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
4d90: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
4da0: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
4db0: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
4dc0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
4dd0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
4de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4df0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
4e00: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
4e10: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4e20: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
4e30: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
4e40: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
4e50: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
4e60: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
4e70: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
4e80: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
4e90: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
4ea0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
4eb0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
4ec0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
4ed0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
4ee0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4ef0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
4f00: 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  teAddPrimaryKey(
4f10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
4f20: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  dList *pList, in
4f30: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
4f40: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
4f50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
4f60: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
4f70: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
4f80: 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  1;.  if( pTab==0
4f90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4fa0: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
4fb0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
4fc0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
4fd0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
4fe0: 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e \"", pTab->zNa
4ff0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22  me, .        "\"
5000: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
5010: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
5020: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
5030: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
5040: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  urn;.  }.  pTab-
5050: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
5060: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5070: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
5080: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
5090: 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
50a0: 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66  >nId==1 ){.    f
50b0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
50c0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
50d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
50e0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
50f0: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  st->a[0].zName, 
5100: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5110: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
5120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
5130: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
5140: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
5150: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
5160: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5170: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
5180: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
5190: 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20  _format>=1 && . 
51a0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
51b0: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
51c0: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
51d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
51e0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
51f0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
5200: 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  nf = onError;.  
5210: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
5220: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  eCreateIndex(pPa
5230: 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  rse, 0, 0, pList
5240: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29  , onError, 0, 0)
5250: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
5260: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65  ome up with a ne
5270: 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66  w random value f
5280: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  or the schema co
5290: 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  okie.  Make sure
52a0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75  .** the new valu
52b0: 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  e is different f
52c0: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a  rom the old..**.
52d0: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
52e0: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
52f0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
5300: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
5310: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
5320: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
5330: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
5340: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
5350: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
5360: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
5370: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
5380: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
5390: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
53a0: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
53b0: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
53c0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
53d0: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
53e0: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
53f0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
5400: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
5410: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
5420: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
5430: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
5440: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
5450: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
5460: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
5470: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
5480: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
5490: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
54a0: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
54b0: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
54c0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
54d0: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
54e0: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
54f0: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
5500: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
5510: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
5520: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
5530: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
5540: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
5550: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
5560: 2a 2f 0a 76 6f 69 64 20 63 68 61 6e 67 65 43 6f  */.void changeCo
5570: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 29  okie(sqlite *db)
5580: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
5590: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68  _cookie==db->sch
55a0: 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20  ema_cookie ){.  
55b0: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
55c0: 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  e = db->schema_c
55d0: 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61  ookie + sqliteRa
55e0: 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a  ndomByte() + 1;.
55f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5600: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
5610: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
5620: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
5630: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
5640: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
5650: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
5660: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
5670: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
5680: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
5690: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
56a0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
56b0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
56c0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  rminator..*/.sta
56d0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
56e0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
56f0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  z){.  int n;.  i
5700: 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30  nt needQuote = 0
5710: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
5720: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
5730: 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20  if( *z=='\'' ){ 
5740: 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31  n++; needQuote=1
5750: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
5760: 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32   n + needQuote*2
5770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
5780: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
5790: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
57a0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
57b0: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
57c0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
57d0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
57e0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
57f0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
5800: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a   char *zIdent){.
5810: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
5820: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
5830: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
5840: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
5850: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
5860: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
5870: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
5880: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
5890: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
58a0: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
58b0: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
58d0: 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43  | sqliteKeywordC
58e0: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
58f0: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
5900: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
5910: 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d  = '\'';.  for(j=
5920: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
5930: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
5940: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
5950: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
5960: 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  \'' ) z[i++] = '
5970: 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  \'';.  }.  if( n
5980: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
5990: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d  ] = '\'';.  z[i]
59a0: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
59b0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
59c0: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
59d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
59e0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
59f0: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
5a00: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
5a10: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
5a20: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
5a30: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
5a40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5a50: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5a60: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
5a70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
5a80: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
5a90: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
5aa0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
5ab0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
5ac0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
5ad0: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
5ae0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    n = 0;.  for(i
5af0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
5b00: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
5b10: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f  entLength(p->aCo
5b20: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  l[i].zName);.  }
5b30: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
5b40: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
5b50: 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20   if( n<40 ){.   
5b60: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
5b70: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
5b80: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
5b90: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
5ba0: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
5bb0: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
5bc0: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
5bd0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 32 35 20 2b 20    }.  n += 25 + 
5be0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
5bf0: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
5c00: 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  c( n );.  if( zS
5c10: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
5c20: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  0;.  assert( !p-
5c30: 3e 69 73 54 65 6d 70 20 29 3b 0a 20 20 73 74 72  >isTemp );.  str
5c40: 63 70 79 28 7a 53 74 6d 74 2c 20 22 43 52 45 41  cpy(zStmt, "CREA
5c50: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
5c60: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
5c70: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
5c80: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
5c90: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
5ca0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30  = '(';.  for(i=0
5cb0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
5cc0: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
5cd0: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
5ce0: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
5cf0: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
5d00: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
5d10: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
5d20: 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  , &k, p->aCol[i]
5d30: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
5d40: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
5d50: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
5d60: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
5d70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5d80: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
5d90: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
5da0: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
5db0: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
5dc0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
5dd0: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
5de0: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
5df0: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
5e00: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
5e10: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
5e20: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
5e30: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
5e40: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
5e50: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
5e60: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
5e70: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
5e80: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
5e90: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
5ea0: 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74  isk,.** unless t
5eb0: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
5ec0: 72 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74  ry table or init
5ed0: 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69  Flag==1.  When i
5ee0: 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69  nitFlag==1,.** i
5ef0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
5f00: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
5f10: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
5f20: 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a  ecause we just.*
5f30: 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74  * connected to t
5f40: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62  he database or b
5f50: 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74  ecause the sqlit
5f60: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68  e_master table h
5f70: 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63  as.** recently c
5f80: 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65  hanges, so the e
5f90: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
5fa0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
5fb0: 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  ts in.** the sql
5fc0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5fd0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  .  We do not wan
5fe0: 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61  t to create it a
5ff0: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gain..**.** If t
6000: 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d  he pSelect argum
6010: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
6020: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
6030: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
6040: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  as called to cre
6050: 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65  ate a table gene
6060: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a  rated from a .**
6070: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e   "CREATE TABLE .
6080: 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  .. AS SELECT ...
6090: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  " statement.  Th
60a0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
60b0: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62  f.** the new tab
60c0: 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68  le will match th
60d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
60e0: 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
60f0: 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62  oid sqliteEndTab
6100: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
6110: 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53  , Token *pEnd, S
6120: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
6130: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
6140: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
6150: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28  se->db;..  if( (
6160: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
6170: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
6180: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
6190: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
61a0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70   return;.  p = p
61b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
61c0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
61d0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64  eturn;..  /* Add
61e0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
61f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
6200: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
6210: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
6220: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
6230: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20  e->nameClash==0 
6240: 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  || pParse->initF
6250: 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
6260: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
6270: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 61  =0 && pParse->na
6280: 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20  meClash==0 ){.  
6290: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
62a0: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
62b0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
62c0: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
62d0: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
62e0: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69  me)+1, p);.    i
62f0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
6300: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
6310: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
6320: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
6330: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
6340: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  t() */.      ret
6350: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
6360: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6370: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
6380: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
6390: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
63a0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
63b0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
63c0: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
63d0: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
63e0: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
63f0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
6400: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
6410: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
6420: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
6430: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54  pSelect ){.    T
6440: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20  able *pSelTab = 
6450: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
6460: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
6470: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
6480: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
6490: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
64a0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
64b0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
64c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
64d0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
64e0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
64f0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
6500: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
6510: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
6520: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
6530: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
6540: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6550: 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74  initFlag is 1 it
6560: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
6570: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
6580: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
6590: 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  te_master" table
65a0: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53   on the disk.  S
65b0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
65c0: 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20  o the disk.  ** 
65d0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
65e0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
65f0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6600: 6c 65 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a  le from the .  *
6610: 2a 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  * pParse->newTnu
6620: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
6630: 61 67 65 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  age number shoul
6640: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 0a  d have been put.
6650: 20 20 2a 2a 20 74 68 65 72 65 20 62 79 20 74 68    ** there by th
6660: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
6670: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
6680: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
6690: 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74  Flag ){.    p->t
66a0: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
66b0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
66c0: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
66d0: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
66e0: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
66f0: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
6700: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
6710: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
6720: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
6730: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
6740: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
6750: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
6760: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
6770: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
6780: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
6790: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
67a0: 61 62 6c 65 2c 20 74 68 65 6e 20 6a 75 73 74 20  able, then just 
67b0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
67c0: 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d  .  Do not.  ** m
67d0: 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ake an entry in 
67e0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 0a 20  SQLITE_MASTER.. 
67f0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
6800: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
6810: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
6820: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
6830: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
6840: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
6850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6860: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6880: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
6890: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
68a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
68b0: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
68c0: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20  ->isTemp);.     
68d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
68e0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
68f0: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
6900: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
6910: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
6920: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
6930: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6940: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6950: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
6960: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69  >tnum = 0;.    i
6970: 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b  f( !p->isTemp ){
6980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
69a0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
69b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
69c0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
69d0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
69e0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
69f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6a00: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6a10: 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f 53 54  , "table", P3_ST
6a20: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ATIC);.      }el
6a30: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6a40: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6a50: 2c 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33  , -1, "view", P3
6a60: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
6a70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
6a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
6a90: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
6aa0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6ab0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
6ac0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
6ad0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6ae0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6af0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6b00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6b10: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d  angeP3(v, -1, p-
6b20: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
6b30: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
6b40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6b50: 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  Dup, 4, 0);.    
6b60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6b70: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6b80: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
6b90: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
6ba0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72      char *z = cr
6bb0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29  eateTableStmt(p)
6bc0: 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 7a 20  ;.        n = z 
6bd0: 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b  ? strlen(z) : 0;
6be0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6bf0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6c00: 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  1, z, n);.      
6c10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
6c20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
6c40: 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nd!=0 );.       
6c50: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
6c60: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
6c70: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
6c80: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   + 1;.        sq
6c90: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6ca0: 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
6cb0: 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e  sFirstToken.z, n
6cc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6cd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6ce0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6cf0: 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 5, 0);.      
6d00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6d10: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
6d20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 68   0, 0);.      ch
6d30: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
6d40: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6d50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6d60: 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  ger, db->next_co
6d70: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  okie, 0);.      
6d80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6d90: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6da0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
6db0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6dc0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
6dd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6de0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6df0: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54   int op = p->isT
6e00: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41  emp ? OP_OpenWrA
6e10: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ux : OP_OpenWrit
6e20: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
6e30: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
6e40: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
6e50: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
6e60: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
6e70: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6e80: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
6e90: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
6ea0: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
6eb0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
6ec0: 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rse);.  }.}../*.
6ed0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
6ee0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
6ef0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
6f00: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
6f10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
6f20: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
6f30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6f40: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
6f50: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6f60: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
6f70: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
6f80: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
6f90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6fa0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
6fb0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
6fc0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
6fd0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
6fe0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
6ff0: 6c 65 63 74 20 20 20 20 2f 2a 20 41 20 53 45 4c  lect    /* A SEL
7000: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
7010: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
7020: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 29  he new view */.)
7030: 7b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  {.  Token sEnd;.
7040: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 6f    Table *p;.  co
7050: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
7060: 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b 0a 0a 20  nt n, offset;.. 
7070: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
7080: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
7090: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 70  , pName, 0);.  p
70a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
70b0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
70c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
70d0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
70e0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
70f0: 0a 20 20 7d 0a 20 20 2f 2a 20 49 67 6e 6f 72 65  .  }.  /* Ignore
7100: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7110: 73 20 6f 6e 20 61 20 53 45 4c 45 43 54 20 2a 2f  s on a SELECT */
7120: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
7130: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
7140: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
7150: 6c 65 74 65 28 70 53 65 6c 65 63 74 2d 3e 70 4f  lete(pSelect->pO
7160: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 53 65  rderBy);.    pSe
7170: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  lect->pOrderBy =
7180: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 53 65   0;.  }.  p->pSe
7190: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
71a0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
71b0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
71c0: 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  f( sqliteViewGet
71d0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
71e0: 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  se, p) ){.      
71f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7200: 7d 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  }.  sEnd = pPars
7210: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
7220: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
7230: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
7240: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
7250: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
7260: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
7270: 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e   n = ((int)sEnd.
7280: 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e  z) - (int)pBegin
7290: 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  ->z;.  z = pBegi
72a0: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
72b0: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
72c0: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
72d0: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
72e0: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
72f0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
7300: 31 3b 0a 20 20 7a 20 3d 20 70 2d 3e 70 53 65 6c  1;.  z = p->pSel
7310: 65 63 74 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 73  ect->zSelect = s
7320: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 2c 20  qliteStrNDup(z, 
7330: 6e 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20  n);.  if( z ){. 
7340: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 69 6e     offset = ((in
7350: 74 29 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67  t)z) - (int)pBeg
7360: 69 6e 2d 3e 7a 3b 0a 20 20 20 20 73 71 6c 69 74  in->z;.    sqlit
7370: 65 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e  eSelectMoveStrin
7380: 67 73 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 6f  gs(p->pSelect, o
7390: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
73a0: 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  teEndTable(pPars
73b0: 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  e, &sEnd, 0);.  
73c0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
73d0: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
73e0: 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
73f0: 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
7400: 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
7410: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
7420: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
7430: 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
7440: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
7450: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
7460: 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
7470: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
7480: 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
7490: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
74a0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
74b0: 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  nt sqliteViewGet
74c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
74d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
74e0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70   *pTable){.  Exp
74f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
7500: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
7510: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
7520: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
7530: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
7540: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
7550: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
7560: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
7570: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
7580: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
7590: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
75a0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
75b0: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
75c0: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
75d0: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
75e0: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
75f0: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
7600: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
7610: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
7620: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
7630: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
7640: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
7650: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
7660: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
7670: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
7680: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
7690: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
76a0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
76b0: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
76c0: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
76d0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
76e0: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
76f0: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2f  * FROM one;.  */
7700: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
7710: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
7720: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
7730: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
7740: 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e  view ", pTable->
7750: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
7760: 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  " is circularly 
7770: 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a 20 20  defined", 0);.  
7780: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7790: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
77a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
77b0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
77c0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
77d0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
77e0: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  ble names..  */.
77f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
7800: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20  ->pSelect ); /* 
7810: 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  If nCol==0, then
7820: 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20   pTable must be 
7830: 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c  a VIEW */.  pSel
7840: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65   = pTable->pSele
7850: 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  ct;..  /* Note t
7860: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
7870: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
7880: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
7890: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
78a0: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
78b0: 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77  his list.  But w
78c0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
78d0: 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a  estore the list.
78e0: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
78f0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
7900: 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72  uration afterwar
7910: 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61  ds, so we save a
7920: 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68   copy of.  ** th
7930: 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45  e original in pE
7940: 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c  List..  */.  pEL
7950: 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69  ist = pSel->pELi
7960: 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  st;.  pSel->pELi
7970: 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  st = sqliteExprL
7980: 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a  istDup(pEList);.
7990: 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69    if( pSel->pELi
79a0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65  st==0 ){.    pSe
79b0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
79c0: 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  st;.    return 1
79d0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
79e0: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61  led */.  }.  pTa
79f0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
7a00: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
7a10: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
7a20: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
7a30: 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  Sel);.  if( pSel
7a40: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
7a50: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
7a60: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  =0 );.    pTable
7a70: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
7a80: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  ->nCol;.    pTab
7a90: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
7aa0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
7ab0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
7ac0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
7ad0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
7ae0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
7af0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 70   pSelTab);.    p
7b00: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
7b10: 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e 72 65 73   |= SQLITE_Unres
7b20: 65 74 56 69 65 77 73 3b 0a 20 20 7d 65 6c 73 65  etViews;.  }else
7b30: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  {.    pTable->nC
7b40: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72  ol = 0;.    nErr
7b50: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
7b60: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65  SelectUnbind(pSe
7b70: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  l);.  sqliteExpr
7b80: 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d  ListDelete(pSel-
7b90: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c  >pEList);.  pSel
7ba0: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
7bb0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  t;.  return nErr
7bc0: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ;  .}../*.** Cle
7bd0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
7be0: 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49 45  mes from the VIE
7bf0: 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  W pTable..**.** 
7c00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7c10: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
7c20: 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65 20  any other table 
7c30: 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69 66  or view is modif
7c40: 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77  ied..** The view
7c50: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
7c60: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
7c70: 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79 20  depend directly 
7c80: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a  or indirectly.**
7c90: 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65 64   on the modified
7ca0: 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62 6c   or deleted tabl
7cb0: 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  e so we need to 
7cc0: 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63 6f  clear the old co
7cd0: 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f  lumn.** names so
7ce0: 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
7cf0: 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a  be recomputed..*
7d00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
7d10: 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c  liteViewResetCol
7d20: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
7d30: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
7d40: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
7d50: 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 53 65  0 || pTable->pSe
7d60: 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  lect==0 ) return
7d70: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  ;.  if( pTable->
7d80: 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  nCol==0 ) return
7d90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7da0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
7db0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
7dc0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
7dd0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
7de0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
7df0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
7e00: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7e10: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
7e20: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
7e30: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
7e40: 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65  >aCol);.  pTable
7e50: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
7e60: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
7e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
7e80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
7e90: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 2e  from every VIEW.
7ea0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56  .*/.void sqliteV
7eb0: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
7ec0: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
7ed0: 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 28 64  lem *i;.  if( (d
7ee0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7ef0: 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3d  E_UnresetViews)=
7f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
7f10: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
7f20: 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  irst(&db->tblHas
7f30: 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
7f40: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
7f50: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
7f60: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
7f70: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
7f80: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
7f90: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
7fa0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
7fb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
7fc0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
7fd0: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
7fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
7ff0: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
8000: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
8010: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
8020: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
8030: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
8040: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
8050: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
8060: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
8070: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
8080: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8090: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20   Token *pTok){. 
80a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
80b0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a  Table *pTab;.  z
80c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
80d0: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
80e0: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
80f0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
8100: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
8110: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
8120: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
8130: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
8140: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
8150: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
8160: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
8170: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
8180: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
8190: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d  , .        pTok-
81a0: 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b  >z, pTok->n, 0);
81b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
81c0: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
81d0: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
81e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
81f0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
8200: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
8210: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8220: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
8230: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
8240: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
8250: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8260: 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
8270: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8280: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
8290: 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ew){.  Table *pT
82a0: 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  able;.  Vdbe *v;
82b0: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73  .  int base;.  s
82c0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
82d0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
82e0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
82f0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
8300: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8310: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54  pTable = sqliteT
8320: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  ableFromToken(pP
8330: 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  arse, pName);.  
8340: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
8350: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
8360: 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  able->readOnly )
8370: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
8380: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
8390: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
83a0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
83b0: 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e   .       " may n
83c0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
83d0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
83e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
83f0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
8400: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
8410: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
8420: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8430: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8440: 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  sg, "use DROP TA
8450: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
8460: 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70 54 61  ble ",.      pTa
8470: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
8480: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
8490: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
84a0: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
84b0: 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65  w && pTable->pSe
84c0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
84d0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
84e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
84f0: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
8500: 64 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a 20  delete view ",. 
8510: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61       pTable->zNa
8520: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
8530: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8540: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
8550: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8560: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
8570: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
8580: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
8590: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
85a0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
85b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
85c0: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
85d0: 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65  VdbeOp dropTable
85e0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
85f0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c  P_OpenWrite,  0,
8600: 20 32 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45   2,        MASTE
8610: 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b  R_NAME},.      {
8620: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
8630: 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c  0, ADDR(9),  0},
8640: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
8650: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
8660: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f       0}, /* 2 */
8670: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
8680: 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
8690: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
86a0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
86b0: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
86c0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 4 */.      {
86d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
86e0: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
86f0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
8700: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
8710: 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  8),  0},.      {
8720: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
8730: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
8740: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
8750: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
8760: 34 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f  4),  0}, /* 8 */
8770: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
8780: 67 65 72 2c 20 20 20 20 30 2c 20 30 2c 20 20 20  ger,    0, 0,   
8790: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f       0}, /* 9 */
87a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43  .      { OP_SetC
87b0: 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20  ookie,  0, 0,   
87c0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
87d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20   OP_Close,      
87e0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
87f0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65  .    };.    Inde
8800: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c  x *pIdx;.    sql
8810: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
8820: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
8830: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
8840: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
8850: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
8860: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
8870: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 70   */.    while (p
8880: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 29  Table->pTrigger)
8890: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 74   {.      Token t
88a0: 74 3b 0a 20 20 20 20 20 20 74 74 2e 7a 20 3d 20  t;.      tt.z = 
88b0: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
88c0: 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 74 74  ->name;.      tt
88d0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
88e0: 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61  le->pTrigger->na
88f0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
8900: 65 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61  eDropTrigger(pPa
8910: 72 73 65 2c 20 26 74 74 2c 20 31 29 3b 0a 20 20  rse, &tt, 1);.  
8920: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 54 61    }.    if( !pTa
8930: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  ble->isTemp ){. 
8940: 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69       base = sqli
8950: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
8960: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
8970: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
8980: 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
8990: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
89a0: 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c 65 2d   base+2, pTable-
89b0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
89c0: 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64    changeCookie(d
89d0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
89e0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
89f0: 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78 74  base+9, db->next
8a00: 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a  _cookie);.    }.
8a10: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
8a20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
8a30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
8a40: 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e  estroy, pTable->
8a50: 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73  tnum, pTable->is
8a60: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
8a70: 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49  (pIdx=pTable->pI
8a80: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
8a90: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
8aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8ab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
8ac0: 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  troy, pIdx->tnum
8ad0: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
8ae0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8af0: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
8b00: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8b10: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
8b20: 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 28  Move the table (
8b30: 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  and all its indi
8b40: 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e 64  ces) to the pend
8b50: 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e 0a  ing DROP queue..
8b60: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20    ** Or, if the 
8b70: 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20  table was never 
8b80: 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74 20  committed, just 
8b90: 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20 74  delete it.  If t
8ba0: 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
8bb0: 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  s been committed
8bc0: 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20 6f   and is placed o
8bd0: 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52  n the pending DR
8be0: 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20 74  OP queue, then t
8bf0: 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 77  he.  ** delete w
8c00: 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20 73  ill occur when s
8c10: 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72  qliteCommitInter
8c20: 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78 65  nalChanges() exe
8c30: 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cutes..  **.  **
8c40: 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74   Exception: if t
8c50: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
8c60: 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20   began with the 
8c70: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c  EXPLAIN keyword,
8c80: 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68  .  ** then no ch
8c90: 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  anges should be 
8ca0: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  made..  */.  if(
8cb0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
8cc0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 50  n ){.    sqliteP
8cd0: 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65 28  endingDropTable(
8ce0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20  db, pTable);.   
8cf0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
8d00: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
8d10: 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  es;.  }.  sqlite
8d20: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 29  ViewResetAll(db)
8d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
8d40: 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
8d50: 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
8d60: 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e   pIndex is the n
8d70: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
8d80: 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20   .** and pTable 
8d90: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
8da0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
8db0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
8dc0: 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
8dd0: 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
8de0: 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
8df0: 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
8e00: 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
8e10: 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
8e20: 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
8e30: 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
8e40: 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
8e50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
8e60: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
8e70: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
8e80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
8e90: 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
8ea0: 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
8eb0: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
8ec0: 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
8ed0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8ee0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
8ef0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
8f00: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
8f10: 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
8f20: 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
8f30: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
8f40: 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
8f50: 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
8f60: 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
8f70: 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
8f80: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
8f90: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8fa0: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
8fb0: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  teCreateIndex(. 
8fc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8fd0: 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
8fe0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
8ff0: 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
9000: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e   *pName,    /* N
9010: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
9020: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
9030: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
9040: 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
9050: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64  the table to ind
9060: 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d  ex.  Use pParse-
9070: 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
9080: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69  */.  IdList *pLi
9090: 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
90a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
90b0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
90c0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f  t onError,     /
90d0: 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
90e0: 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
90f0: 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
9100: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
9110: 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54  ,   /* The CREAT
9120: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
9130: 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42  ins a CREATE TAB
9140: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
9150: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20    Token *pEnd   
9160: 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
9170: 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
9180: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
9190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ment */.){.  Tab
91a0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
91b0: 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
91c0: 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
91d0: 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68  *pIndex;   /* Th
91e0: 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
91f0: 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
9200: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
9210: 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
9220: 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20  nullId;         
9230: 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
9240: 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
9250: 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  D list */.  sqli
9260: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
9270: 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65 4e  >db;.  int hideN
9280: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
9290: 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20 74   /* Do not put t
92a0: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
92b0: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 0a   hash table */..
92c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
92d0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
92e0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
92f0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9300: 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
9310: 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
9320: 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
9330: 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
9340: 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
9350: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
9360: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ble!=0 ){.    as
9370: 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29  sert( pName!=0 )
9380: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73 71  ;.    pTab =  sq
9390: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
93a0: 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  en(pParse, pTabl
93b0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
93c0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
93d0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
93e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
93f0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  le;.  }.  if( pT
9400: 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
9410: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
9420: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9430: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
9440: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
9450: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
9460: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
9470: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
9480: 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d 61  ame, .      " ma
9490: 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20 69  y not have new i
94a0: 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 30  ndices added", 0
94b0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
94c0: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
94d0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
94e0: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  x;.  }.  if( pTa
94f0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
9500: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
9510: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
9520: 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  sg, "views may n
9530: 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
9540: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
9550: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
9560: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
9570: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ex;.  }..  /* If
9580: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 63   this index is c
9590: 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65 2d  reated while re-
95a0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68 65  reading the sche
95b0: 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  ma from sqlite_m
95c0: 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20 74  aster.  ** but t
95d0: 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
95e0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
95f0: 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72 61  dex is a tempora
9600: 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61 6e  ry table, it can
9610: 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20  .  ** only mean 
9620: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 74  that the table t
9630: 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69  hat this index i
9640: 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69 61  s really associa
9650: 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a 2a  ted with is.  **
9660: 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65 20   one whose name 
9670: 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e 64  is hidden behind
9680: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
9690: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
96a0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63   name..  ** Sinc
96b0: 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73 20  e its table has 
96c0: 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64 2c  been suppressed,
96d0: 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f   we need to also
96e0: 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20 20   suppress the.  
96f0: 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  ** index..  */. 
9700: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
9710: 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d 3e 69  tFlag && pTab->i
9720: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74  sTemp ){.    got
9730: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9740: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
9750: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
9760: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
9770: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
9780: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
9790: 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
97a0: 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
97b0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
97c0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
97d0: 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
97e0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
97f0: 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
9800: 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
9810: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
9820: 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
9830: 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
9840: 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
9850: 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
9860: 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
9870: 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
9880: 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
9890: 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
98a0: 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
98b0: 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
98c0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
98d0: 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
98e0: 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e  x, but we will n
98f0: 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74  ot.  ** store it
9900: 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61  s name in the ha
9910: 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74  sh table.  Set t
9920: 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67  he hideName flag
9930: 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20   to accomplish. 
9940: 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20   ** this..  **. 
9950: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
9960: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
9970: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
9980: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
9990: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
99a0: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
99b0: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
99c0: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
99d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
99e0: 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  e ){.    Index *
99f0: 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pISameName;    /
9a00: 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20  * Another index 
9a10: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
9a20: 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  me */.    Table 
9a30: 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pTSameName;    
9a40: 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20  /* A table with 
9a50: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
9a60: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e   index */.    zN
9a70: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
9a80: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
9a90: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
9aa0: 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
9ab0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
9ac0: 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61 6d  ;.    if( (pISam
9ad0: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
9ae0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
9af0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
9b00: 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e  if( pISameName->
9b10: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26  pTable->isTemp &
9b20: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
9b30: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69  ag ){.        hi
9b40: 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  deName = 1;.    
9b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9b60: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
9b70: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
9b80: 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61  g, "index ", zNa
9b90: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
9ba0: 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
9bb0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
9bc0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9bd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
9be0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
9bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9c00: 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
9c10: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
9c20: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d  le(db, zName))!=
9c30: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
9c40: 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d  TSameName->isTem
9c50: 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69  p && pParse->ini
9c60: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  tFlag ){.       
9c70: 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20   hideName = 1;. 
9c80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9c90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9ca0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9cb0: 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20  rMsg, "there is 
9cc0: 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
9cd0: 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20  named ",.       
9ce0: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
9cf0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9d00: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
9d10: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
9d20: 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
9d30: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9d40: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
9d50: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
9d60: 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
9d70: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
9d80: 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
9d90: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
9da0: 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
9db0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
9dc0: 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20  f,"%d)",n);.    
9dd0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
9de0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
9df0: 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62  zName, "(", pTab
9e00: 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69  ->zName, " autoi
9e10: 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29  ndex ", zBuf, 0)
9e20: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
9e30: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
9e40: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
9e50: 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69   hideName = sqli
9e60: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
9e70: 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a  zName)!=0;.  }..
9e80: 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
9e90: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
9ea0: 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
9eb0: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
9ec0: 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
9ed0: 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
9ee0: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
9ef0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
9f00: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
9f10: 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
9f20: 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
9f30: 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
9f40: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9f50: 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
9f60: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
9f70: 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
9f80: 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
9f90: 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
9fa0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9fb0: 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30  teIdListAppend(0
9fc0: 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
9fd0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
9fe0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
9ff0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
a000: 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
a010: 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
a020: 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e  ure. .  */.  pIn
a030: 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
a040: 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  oc( sizeof(Index
a050: 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ) + strlen(zName
a060: 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20  ) + 1 +.        
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73  sizeof(int)*pLis
a090: 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20  t->nId );.  if( 
a0a0: 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f  pIndex==0 ) goto
a0b0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
a0c0: 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ex;.  pIndex->ai
a0d0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
a0e0: 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e  pIndex[1];.  pIn
a0f0: 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
a100: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ar*)&pIndex->aiC
a110: 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64  olumn[pList->nId
a120: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
a130: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
a140: 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
a150: 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
a160: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
a170: 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49  pList->nId;.  pI
a180: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
a190: 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65  pIndex->isUnique
a1a0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f   = onError;..  /
a1b0: 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
a1c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
a1d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
a1e0: 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
a1f0: 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
a200: 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
a210: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
a220: 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
a230: 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
a240: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
a250: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
a260: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
a270: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
a280: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
a290: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
a2a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
a2b0: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
a2c0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
a2d0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
a2e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
a2f0: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
a300: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
a310: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
a320: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
a330: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
a340: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
a350: 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  " has no column 
a360: 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e  named ", pList->
a370: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  a[i].zName, 0);.
a380: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
a390: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  rr++;.      sqli
a3a0: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
a3b0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
a3c0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
a3d0: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
a3e0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
a3f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
a400: 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
a410: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
a420: 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
a430: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
a440: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
a450: 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
a460: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
a470: 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e  xplain && !hideN
a480: 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ame ){.    Index
a490: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
a4a0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
a4b0: 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64  b->idxHash, pInd
a4c0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
a4d0: 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  n(zName)+1, pInd
a4e0: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
a4f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a500: 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
a510: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
a520: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
a530: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
a540: 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  dex);.      goto
a550: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
a560: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
a570: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
a580: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
a590: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
a5a0: 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
a5b0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
a5c0: 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
a5d0: 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
a5e0: 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
a5f0: 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
a600: 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
a610: 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
a620: 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
a630: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
a640: 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
a650: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
a660: 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
a670: 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
a680: 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
a690: 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
a6a0: 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
a6b0: 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
a6c0: 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
a6d0: 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65  lace){.    pInde
a6e0: 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
a6f0: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61  >pIndex;.    pTa
a700: 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
a710: 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
a720: 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
a730: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
a740: 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
a750: 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
a760: 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
a770: 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
a780: 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
a790: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
a7a0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
a7b0: 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
a7c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68  >pNext;.    pOth
a7d0: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
a7e0: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ex;.  }..  /* If
a7f0: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
a800: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
a810: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
a820: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
a830: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
a840: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
a850: 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72  k.  So do not wr
a860: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a  ite to the disk.
a870: 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74    ** again.  Ext
a880: 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e  ract the table n
a890: 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70  umber from the p
a8a0: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66  Parse->newTnum f
a8b0: 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ield..  */.  if(
a8c0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
a8d0: 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29  g && pTable!=0 )
a8e0: 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  {.    pIndex->tn
a8f0: 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77  um = pParse->new
a900: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
a910: 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20  If the initFlag 
a920: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
a930: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
a940: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
a950: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
a960: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
a970: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
a980: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
a990: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
a9a0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
a9b0: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
a9c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69   **.  ** The ini
a9d0: 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20  tFlag is 0 when 
a9e0: 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
a9f0: 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
aa00: 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
aa10: 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61  nd.  The initFla
aa20: 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  g is 1 when a da
aa30: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
aa40: 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
aa50: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
aa60: 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
aa70: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
aa80: 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
aa90: 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
aaa0: 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
aab0: 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
aac0: 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
aad0: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
aae0: 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
aaf0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61    **.  ** If pTa
ab00: 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ble==0 it means 
ab10: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
ab20: 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
ab30: 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
ab40: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
ab50: 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
ab60: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
ab70: 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
ab80: 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
ab90: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
aba0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
abb0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
abc0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
abd0: 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
abe0: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
abf0: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
ac00: 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20  initFlag==0 ){. 
ac10: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
ac20: 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c  be *v;.    int l
ac30: 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69  bl1, lbl2;.    i
ac40: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64  nt i;.    int ad
ac50: 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65  dr;.    int isTe
ac60: 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d  mp = pTab->isTem
ac70: 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  p;..    v = sqli
ac80: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
ac90: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
aca0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
acb0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
acc0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
acd0: 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
ace0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
acf0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
ad00: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
ad10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ad20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
ad30: 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  rite, 0, 2);.   
ad40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
ad50: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d  hangeP3(v, -1, M
ad60: 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53  ASTER_NAME, P3_S
ad70: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
ad80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
ad90: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
ada0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
adb0: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
adc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
add0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ade0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
adf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ae00: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
ae10: 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
ae20: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
ae30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ae40: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
ae50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ae60: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
ae70: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
ae80: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ae90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
aea0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
aeb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
aec0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
aed0: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
aee0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
aef0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
af00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
af10: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
af20: 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  ex, 0, isTemp);.
af30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
af40: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
af50: 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
af60: 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52  tnum, P3_POINTER
af70: 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  );.    pIndex->t
af80: 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  num = 0;.    if(
af90: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
afa0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
afb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
afc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
afd0: 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20  nWrAux, 1, 0);. 
afe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aff0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b000: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
b010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
b020: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b030: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
b040: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b050: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54    }.    if( !isT
b060: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64  emp ){.      add
b070: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
b080: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
b090: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
b0a0: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
b0b0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d  d ){.        n =
b0c0: 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
b0d0: 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29   Addr(pStart->z)
b0e0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   + 1;.        sq
b0f0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
b100: 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74  (v, addr, pStart
b110: 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ->z, n);.      }
b120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
b140: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a  eRecord, 5, 0);.
b150: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b160: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
b170: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
b180: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
b190: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
b1a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69  teVdbeAddOp(v, i
b1b0: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41  sTemp ? OP_OpenA
b1c0: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c  ux : OP_Open, 2,
b1d0: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
b1e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
b1f0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
b200: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
b210: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c  ATIC);.      lbl
b220: 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  2 = sqliteVdbeMa
b230: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
b240: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b250: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
b260: 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  2, lbl2);.      
b270: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
b280: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
b290: 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  no, 2, 0);.     
b2a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
b2b0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
b2c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b2d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b2e0: 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64  _Column, 2, pInd
b2f0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  ex->aiColumn[i])
b300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b310: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b320: 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  v, OP_MakeIdxKey
b330: 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
b340: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
b350: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b360: 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
b370: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
b380: 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73  E_None);.      s
b390: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b3a0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
b3b0: 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l1);.      sqlit
b3c0: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
b3d0: 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  l(v, lbl2);.    
b3e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b3f0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32  p(v, OP_Close, 2
b400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b410: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b420: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
b430: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
b440: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
b450: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
b460: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f          changeCo
b470: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20  okie(db);.      
b480: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b490: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b4a0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
b4b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
b4c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b4d0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
b4e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
b4f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b500: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
b510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b520: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
b530: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
b540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b550: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
b560: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
b570: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
b580: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
b590: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
b5a0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
b5b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
b5c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b5d0: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
b5e0: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
b5f0: 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
b600: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
b610: 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
b620: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
b630: 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65  d sqliteDropInde
b640: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
b650: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
b660: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
b670: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
b680: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
b690: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
b6a0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
b6b0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
b6c0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
b6d0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e  d ) return;.  zN
b6e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
b6f0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
b700: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
b710: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
b720: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
b730: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
b740: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
b750: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
b760: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
b770: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
b780: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
b790: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69  rMsg, "no such i
b7a0: 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20  ndex: ", 0, .   
b7b0: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70       pName->z, p
b7c0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
b7d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
b7e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b7f0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
b800: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
b810: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
b820: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
b830: 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
b840: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
b850: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
b860: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
b870: 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a  dropIndex[] = {.
b880: 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57        { OP_OpenW
b890: 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20 20  rite,  0, 2,    
b8a0: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c     MASTER_NAME},
b8b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
b8c0: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
b8d0: 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20 20 20 7b  10),0}, .      {
b8e0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
b8f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
b900: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 2 */.      { 
b910: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
b920: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
b930: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
b940: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
b950: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
b960: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
b970: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
b980: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
b990: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
b9a0: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
b9b0: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
b9c0: 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20 30     0, ADDR(4), 0
b9d0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
b9e0: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
b9f0: 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20 20 20 20  R(10),0},.      
ba00: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
ba10: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
ba20: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 9 */.      {
ba30: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
ba40: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
ba50: 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 10 */.      {
ba60: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
ba70: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
ba80: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65        { OP_Close
ba90: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  ,      0, 0,    
baa0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
bab0: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20    int base;.    
bac0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
bad0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  ndex->pTable;.. 
bae0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
baf0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
bb00: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rse);.    if( !p
bb10: 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  Tab->isTemp ){. 
bb20: 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69       base = sqli
bb30: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
bb40: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
bb50: 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
bb60: 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
bb70: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
bb80: 20 62 61 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d   base+2, pIndex-
bb90: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
bba0: 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  C);.      change
bbb0: 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20  Cookie(db);.    
bbc0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
bbd0: 67 65 50 31 28 76 2c 20 62 61 73 65 2b 31 30 2c  geP1(v, base+10,
bbe0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
bbf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
bc00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bc10: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64  OP_Destroy, pInd
bc20: 65 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e  ex->tnum, pTab->
bc30: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
bc40: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
bc50: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
bc60: 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65  }..  /* Move the
bc70: 20 69 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65 20   index onto the 
bc80: 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65  pending DROP que
bc90: 75 65 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  ue.  Or, if the 
bca0: 69 6e 64 65 78 20 77 61 73 0a 20 20 2a 2a 20 6e  index was.  ** n
bcb0: 65 76 65 72 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ever committed, 
bcc0: 6a 75 73 74 20 64 65 6c 65 74 65 20 69 74 2e 20  just delete it. 
bcd0: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
bce0: 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65  pending DROP que
bcf0: 75 65 0a 20 20 2a 2a 20 67 65 74 20 64 65 6c 65  ue.  ** get dele
bd00: 74 65 64 20 62 79 20 73 71 6c 69 74 65 43 6f 6d  ted by sqliteCom
bd10: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
bd20: 65 73 28 29 20 77 68 65 6e 20 74 68 65 20 75 73  es() when the us
bd30: 65 72 20 65 78 65 63 75 74 65 73 0a 20 20 2a 2a  er executes.  **
bd40: 20 61 20 43 4f 4d 4d 49 54 2e 20 20 4f 72 20 69   a COMMIT.  Or i
bd50: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
bd60: 75 72 73 2c 20 74 68 65 20 65 6c 65 6d 65 6e 74  urs, the element
bd70: 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20 71 75  s of the DROP qu
bd80: 65 75 65 0a 20 20 2a 2a 20 61 72 65 20 6d 6f 76  eue.  ** are mov
bd90: 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
bda0: 20 6d 61 69 6e 20 68 61 73 68 20 74 61 62 6c 65   main hash table
bdb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
bdc0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
bdd0: 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69  .    sqlitePendi
bde0: 6e 67 44 72 6f 70 49 6e 64 65 78 28 64 62 2c 20  ngDropIndex(db, 
bdf0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d  pIndex);.    db-
be00: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
be10: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
be20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70    }.}../*.** App
be30: 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
be40: 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
be50: 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
be60: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
be70: 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
be80: 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
be90: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
bea0: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
beb0: 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
bec0: 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70  *sqliteIdListApp
bed0: 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
bee0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
bef0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
bf00: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
bf10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
bf20: 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
bf30: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
bf40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
bf50: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
bf60: 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  nId & 7)==0 ){. 
bf70: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
bf80: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20  _item *a;.    a 
bf90: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
bfa0: 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74  pList->a, (pList
bfb0: 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28  ->nId+8)*sizeof(
bfc0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
bfd0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
bfe0: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
bff0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
c000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c010: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c020: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d  ->a = a;.  }.  m
c030: 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
c040: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20  pList->nId], 0, 
c050: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
c060: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  0]));.  if( pTok
c070: 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
c080: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
c090: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
c0a0: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
c0b0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
c0c0: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
c0d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
c0e0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
c0f0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
c100: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
c110: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
c120: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c130: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
c140: 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
c150: 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
c160: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
c170: 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
c180: 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
c190: 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
c1a0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
c1b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
c1c0: 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73 28  eIdListAddAlias(
c1d0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
c1e0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
c1f0: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
c200: 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20  ist->nId>0 ){.  
c210: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
c220: 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73 71  >nId - 1;.    sq
c230: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
c240: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
c250: 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  as, pToken->z, p
c260: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
c270: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
c280: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
c290: 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  as);.  }.}../*.*
c2a0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
c2b0: 72 65 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  re IdList..*/.vo
c2c0: 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  id sqliteIdListD
c2d0: 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c  elete(IdList *pL
c2e0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
c2f0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
c300: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
c310: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
c320: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
c330: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
c340: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
c350: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
c360: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
c370: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
c380: 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
c390: 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
c3a0: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
c3b0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
c3c0: 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  le(0, pList->a[i
c3d0: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
c3e0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
c3f0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
c400: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  ].pSelect);.  }.
c410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
c420: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
c430: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
c440: 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20 63  /*.** The COPY c
c450: 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63 6f  ommand is for co
c460: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
c470: 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64 20   PostgreSQL and 
c480: 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a  specificially.**
c490: 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74 79   for the ability
c4a0: 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74   to read the out
c4b0: 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20  put of pg_dump. 
c4c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20 61   The format is a
c4d0: 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s.** follows:.**
c4e0: 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62 6c  .**    COPY tabl
c4f0: 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49  e FROM file [USI
c500: 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73 74  NG DELIMITERS st
c510: 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62  ring].**.** "tab
c520: 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74 69  le" is an existi
c530: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ng table name.  
c540: 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e  We will read lin
c550: 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a  es of code from.
c560: 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20  ** file to fill 
c570: 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68 20  this table with 
c580: 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67 68  data.  File migh
c590: 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20 54  t be "stdin".  T
c5a0: 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  he optional.** d
c5b0: 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67 20  elimiter string 
c5c0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 66  identifies the f
c5d0: 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73 2e  ield separators.
c5e0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
c5f0: 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20   a tab..*/.void 
c600: 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50 61  sqliteCopy(.  Pa
c610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c620: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
c630: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
c640: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ken *pTableName,
c650: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f     /* The name o
c660: 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  f the table into
c670: 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 69   which we will i
c680: 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  nsert */.  Token
c690: 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *pFilename,    
c6a0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d  /* The file from
c6b0: 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69 6e   which to obtain
c6c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
c6d0: 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69    Token *pDelimi
c6e0: 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20 74 68  ter,   /* Use th
c6f0: 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64 20  is as the field 
c700: 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20 20 69  delimiter */.  i
c710: 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20 20 20  nt onError      
c720: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
c730: 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  o if a constrain
c740: 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20  t fails */.){.  
c750: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63  Table *pTab;.  c
c760: 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74  har *zTab;.  int
c770: 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   i;.  Vdbe *v;. 
c780: 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a   int addr, end;.
c790: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
c7a0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
c7b0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61  arse->db;..  zTa
c7c0: 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  b = sqliteTableN
c7d0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
c7e0: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
c7f0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
c800: 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  iled || zTab==0 
c810: 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61  ) goto copy_clea
c820: 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  nup;.  pTab = sq
c830: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f 54  liteTableNameToT
c840: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a 54 61  able(pParse, zTa
c850: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
c860: 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 70 54  (zTab);.  if( pT
c870: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70  ab==0 ) goto cop
c880: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 76 20 3d  y_cleanup;.  v =
c890: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
c8a0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
c8b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e 4f  ){.    int openO
c8c0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67  p;.    sqliteBeg
c8d0: 69 6e 4d 75 6c 74 69 57 72 69 74 65 4f 70 65 72  inMultiWriteOper
c8e0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
c8f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c910: 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b  FileOpen, 0, 0);
c920: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
c930: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
c940: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70   pFilename->z, p
c950: 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  Filename->n);.  
c960: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
c970: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
c980: 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61      openOp = pTa
c990: 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f  b->isTemp ? OP_O
c9a0: 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70  penWrAux : OP_Op
c9b0: 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71 6c  enWrite;.    sql
c9c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c9d0: 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d  openOp, 0, pTab-
c9e0: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >tnum);.    sqli
c9f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
ca00: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
ca10: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
ca20: 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78     for(i=1, pIdx
ca30: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ca40: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ca50: 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20  pNext, i++){.   
ca60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ca70: 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c  Op(v, openOp, i,
ca80: 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pIdx->tnum);.  
ca90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
caa0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
cab0: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  dx->zName, P3_ST
cac0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
cad0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
cae0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
caf0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
cb00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cb10: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
cb20: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
cb30: 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f  the row count */
cb40: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d  .    }.    end =
cb50: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
cb60: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64  abel(v);.    add
cb70: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
cb80: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65  dOp(v, OP_FileRe
cb90: 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  ad, pTab->nCol, 
cba0: 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44  end);.    if( pD
cbb0: 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20  elimiter ){.    
cbc0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
cbd0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44  geP3(v, addr, pD
cbe0: 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65  elimiter->z, pDe
cbf0: 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20  limiter->n);.   
cc00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
cc10: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
cc20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cc30: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
cc40: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c  geP3(v, addr, "\
cc50: 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  t", 1);.    }.  
cc60: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
cc70: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y>=0 ){.      sq
cc80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cc90: 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20   OP_FileColumn, 
cca0: 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b  pTab->iPKey, 0);
ccb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ccc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
ccd0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
cce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ccf0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cd00: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
cd10: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
cd20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
cd30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
cd40: 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d      if( i==pTab-
cd50: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
cd60: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
cd70: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
cd80: 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77 69  umn is filled wi
cd90: 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74  th NULL since it
cda0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c  s.        ** val
cdb0: 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75 6c  ue is always pul
cdc0: 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63  led from the rec
cdd0: 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ord number */.  
cde0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
cdf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
ce00: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
ce10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ce20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ce30: 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e  v, OP_FileColumn
ce40: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , i, 0);.      }
ce50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ce60: 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  eGenerateConstra
ce70: 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73 65  intChecks(pParse
ce80: 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  , pTab, 0, 0, 0,
ce90: 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64   0, onError, add
cea0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f  r);.    sqliteCo
ceb0: 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28  mpleteInsertion(
cec0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
ced0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
cee0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
cef0: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
cf00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
cf10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cf20: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30   OP_AddImm, 1, 0
cf30: 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  );  /* Increment
cf40: 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   row count */.  
cf50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
cf60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
cf70: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
cf80: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
cf90: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29  lveLabel(v, end)
cfa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
cfb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
cfc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
cfd0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
cfe0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
cff0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
d000: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
d010: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
d020: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d030: 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31  P_ColumnCount, 1
d040: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d050: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d060: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c  P_ColumnName, 0,
d070: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d080: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d090: 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65 72   -1, "rows inser
d0a0: 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ted", P3_STATIC)
d0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d0c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
d0d0: 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20  llback, 1, 0);. 
d0e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79     }.  }.  .copy
d0f0: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75  _cleanup:.  retu
d100: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
d110: 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41   non-standard VA
d120: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  CUUM command is 
d130: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
d140: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
d150: 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20  * collapse free 
d160: 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20  space, etc.  It 
d170: 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65  is modelled afte
d180: 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  r the VACUUM com
d190: 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67  mand.** in Postg
d1a0: 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  reSQL..**.** In 
d1b0: 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20 6f 66  version 1.0.x of
d1c0: 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56 41 43   SQLite, the VAC
d1d0: 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f 75 6c  UUM command woul
d1e0: 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f 72  d call.** gdbm_r
d1f0: 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e 20 61  eorganize() on a
d200: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
d210: 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62 65 67  tables.  But beg
d220: 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 32  inning.** with 2
d230: 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e 6f 20  .0.0, SQLite no 
d240: 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44 42 4d  longer uses GDBM
d250: 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   so this command
d260: 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65 20 61   has.** become a
d270: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20   no-op..*/.void 
d280: 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61 72  sqliteVacuum(Par
d290: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
d2a0: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a  n *pTableName){.
d2b0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
d2c0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  */.}../*.** Begi
d2d0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
d2e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65  */.void sqliteBe
d2f0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
d300: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
d310: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73 71  t onError){.  sq
d320: 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28  lite *db;..  if(
d330: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
d340: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
d350: 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29   || db->pBe==0 )
d360: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
d370: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
d380: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
d390: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
d3a0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
d3b0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
d3c0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
d3d0: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
d3e0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
d3f0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
d400: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64  ITE_InTrans;.  d
d410: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  b->onError = onE
d420: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rror;.}../*.** C
d430: 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
d440: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
d450: 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  teCommitTransact
d460: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d470: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
d480: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
d490: 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
d4a0: 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
d4b0: 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBe==0 ) return;
d4c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
d4d0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
d4e0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
d4f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d  turn;.  if( (db-
d500: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d510: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65  InTrans)==0 ) re
d520: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  turn;.  db->flag
d530: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
d540: 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e  rans;.  sqliteEn
d550: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
d560: 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f  pParse);.  db->o
d570: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
d580: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ult;.}../*.** Ro
d590: 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
d5a0: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
d5b0: 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  iteRollbackTrans
d5c0: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
d5d0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
d5e0: 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
d5f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
d600: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
d610: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
d620: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
d630: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
d640: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
d650: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
d660: 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
d670: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
d680: 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75  Trans)==0 ) retu
d690: 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  rn;.  v = sqlite
d6a0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d6b0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
d6c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d6d0: 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20  v, OP_Rollback, 
d6e0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  0, 0);.  }.  db-
d6f0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
d700: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d  E_InTrans;.  db-
d710: 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65  >onError = OE_De
d720: 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fault;.}../*.** 
d730: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
d740: 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
d750: 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
d760: 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
d770: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
d780: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
d790: 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 62  operation will b
d7a0: 65 20 61 74 6f 6d 69 63 20 69 6e 20 74 68 65 0a  e atomic in the.
d7b0: 2a 2a 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  ** sense that it
d7c0: 20 77 69 6c 6c 20 65 69 74 68 65 72 20 64 6f 20   will either do 
d7d0: 69 74 73 20 63 68 61 6e 67 65 73 20 63 6f 6d 70  its changes comp
d7e0: 6c 65 74 65 6c 79 20 6f 72 20 6e 6f 74 20 61 74  letely or not at
d7f0: 0a 2a 2a 20 61 6c 6c 2e 20 20 53 6f 20 74 68 65  .** all.  So the
d800: 72 65 20 69 73 20 6e 6f 74 20 6e 65 65 64 20 74  re is not need t
d810: 6f 20 73 65 74 20 61 20 63 68 65 63 6b 70 6f 69  o set a checkpoi
d820: 6e 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  nt is a transact
d830: 69 6f 6e 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ion.** is alread
d840: 79 20 69 6e 20 65 66 66 65 63 74 2e 0a 2a 2f 0a  y in effect..*/.
d850: 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e  void sqliteBegin
d860: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
d870: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
d880: 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20   Vdbe *v;.  v = 
d890: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
d8a0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
d8b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
d8c0: 20 28 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   (pParse->trigSt
d8d0: 61 63 6b 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  ack) return; /* 
d8e0: 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20  if this is in a 
d8f0: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28  trigger */.  if(
d900: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
d910: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
d920: 72 61 6e 73 29 3d 3d 30 20 20 29 7b 0a 20 20 20  rans)==0  ){.   
d930: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d940: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
d950: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  on, 0, 0);.    s
d960: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d970: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
d980: 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73  e, pParse->db->s
d990: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29  chema_cookie, 0)
d9a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63  ;.    pParse->sc
d9b0: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
d9c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
d9d0: 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
d9e0: 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
d9f0: 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
da00: 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
da10: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
da20: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
da30: 70 65 72 61 74 69 6f 6e 20 6d 69 67 68 74 20 6e  peration might n
da40: 6f 74 20 62 65 20 61 74 6f 6d 69 63 20 69 6e 0a  ot be atomic in.
da50: 2a 2a 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  ** the sense tha
da60: 74 20 61 6e 20 65 72 72 6f 72 20 6d 61 79 20 62  t an error may b
da70: 65 20 64 69 73 63 6f 76 65 72 65 64 20 61 6e 64  e discovered and
da80: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
da90: 69 67 68 74 0a 2a 2a 20 61 62 6f 72 74 20 61 66  ight.** abort af
daa0: 74 65 72 20 73 6f 6d 65 20 63 68 61 6e 67 65 73  ter some changes
dab0: 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e   have been made.
dac0: 20 20 49 66 20 77 65 20 61 72 65 20 69 6e 20 74    If we are in t
dad0: 68 65 20 6d 69 64 64 6c 65 20 0a 2a 2a 20 6f 66  he middle .** of
dae0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
daf0: 74 68 65 6e 20 74 68 69 73 20 73 65 74 73 20 61  then this sets a
db00: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 20 49 66   checkpoint.  If
db10: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 0a 2a   we are not in.*
db20: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  * a transaction,
db30: 20 74 68 65 6e 20 73 74 61 72 74 20 61 20 74 72   then start a tr
db40: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  ansaction..*/.vo
db50: 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 4d 75  id sqliteBeginMu
db60: 6c 74 69 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ltiWriteOperatio
db70: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
db80: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
db90: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
dba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
dbb0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
dbc0: 20 69 66 20 28 70 50 61 72 73 65 2d 3e 74 72 69   if (pParse->tri
dbd0: 67 53 74 61 63 6b 29 20 72 65 74 75 72 6e 3b 20  gStack) return; 
dbe0: 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
dbf0: 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
dc00: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
dc10: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
dc20: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
dc30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
dc40: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
dc50: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
dc60: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
dc70: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
dc80: 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d  kie, pParse->db-
dc90: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20  >schema_cookie, 
dca0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
dcb0: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
dcc0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
dcd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
dce0: 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  (v, OP_Checkpoin
dcf0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.
dd00: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
dd10: 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75  code that conclu
dd20: 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  des an operation
dd30: 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
dd40: 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61  hanged.** the da
dd50: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
dd60: 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e   a companion fun
dd70: 63 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72  ction to BeginWr
dd80: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a  iteOperation()..
dd90: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
dda0: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
ddb0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e   then commit it.
ddc0: 20 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e    If a checkpoin
ddd0: 74 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64  t was.** started
dde0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61   then commit tha
ddf0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
de00: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
de10: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
de20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
de30: 69 66 20 28 70 50 61 72 73 65 2d 3e 74 72 69 67  if (pParse->trig
de40: 53 74 61 63 6b 29 20 72 65 74 75 72 6e 3b 20 2f  Stack) return; /
de50: 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20  * if this is in 
de60: 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76  a trigger */.  v
de70: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
de80: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
de90: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
dea0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
deb0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
dec0: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f  InTrans ){.    /
ded0: 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do Nothing */.
dee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
def0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
df00: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  OP_Commit, 0, 0)
df10: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
df20: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
df30: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
df40: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
df50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
df60: 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29  Boolean(char *z)
df70: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
df80: 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79  *azTrue[] = { "y
df90: 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65  es", "on", "true
dfa0: 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
dfb0: 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
dfc0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
dfd0: 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
dfe0: 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
dff0: 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
e000: 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
e010: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
e020: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75  ; i<sizeof(azTru
e030: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65  e)/sizeof(azTrue
e040: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
e050: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
e060: 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d  p(z,azTrue[i])==
e070: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
e080: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
e090: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
e0a0: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
e0b0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d  t.  .**.** Pragm
e0c0: 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66  as are of this f
e0d0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
e0e0: 50 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75  PRAGMA id = valu
e0f0: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e  e.**.** The iden
e100: 74 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73  tifier might als
e110: 6f 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20  o be a string.  
e120: 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  The value is a s
e130: 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64  tring, and.** id
e140: 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e  entifier, or a n
e150: 75 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73  umber.  If minus
e160: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
e170: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a  en the value is.
e180: 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74  ** a number that
e190: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
e1a0: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
e1b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61  /.void sqlitePra
e1c0: 67 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  gma(Parse *pPars
e1d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c  e, Token *pLeft,
e1e0: 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20   Token *pRight, 
e1f0: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
e200: 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20    char *zLeft = 
e210: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  0;.  char *zRigh
e220: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20  t = 0;.  sqlite 
e230: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e240: 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c  ;..  zLeft = sql
e250: 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74  iteStrNDup(pLeft
e260: 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a  ->z, pLeft->n);.
e270: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
e280: 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69  zLeft);.  if( mi
e290: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a  nusFlag ){.    z
e2a0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73  Right = 0;.    s
e2b0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
e2c0: 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c  &zRight, "-", 1,
e2d0: 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67   pRight->z, pRig
e2e0: 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  ht->n, 0);.  }el
e2f0: 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d  se{.    zRight =
e300: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
e310: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
e320: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
e330: 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b  Dequote(zRight);
e340: 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a  .  }. .  /*.  **
e350: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
e360: 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  _cache_size.  **
e370: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
e380: 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20  _cache_size=N.  
e390: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
e3a0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
e3b0: 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69  he current persi
e3c0: 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  stent setting fo
e3d0: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
e3e0: 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65  cache size.  The
e3f0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
e400: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
e410: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
e420: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
e430: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
e440: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74  nd form sets bot
e450: 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  h the current.  
e460: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
e470: 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  ze value and the
e480: 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65   persistent page
e490: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
e4a0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
e4b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e4c0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
e4d0: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
e4e0: 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69  size is stored i
e4f0: 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f  n meta-value 2 o
e500: 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a  f page 1 of the.
e510: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e520: 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65 20 73  le.  The cache s
e530: 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ize is actually 
e540: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
e550: 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  ue of.  ** this 
e560: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
e570: 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65    The sign of me
e580: 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72  ta-value 2 deter
e590: 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  mines the.  ** s
e5a0: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
e5b0: 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  ng.  A negative 
e5c0: 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63  value means sync
e5d0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20  hronous is off. 
e5e0: 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69   ** and a positi
e5f0: 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73  ve value means s
e600: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
e610: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
e620: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
e630: 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  ,"default_cache_
e640: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
e650: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
e660: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
e670: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  {.      { OP_Rea
e680: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
e690: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
e6a0: 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20   { OP_AbsValue, 
e6b0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
e6c0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
e6d0: 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  up,         0, 0
e6e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
e6f0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
e700: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
e710: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
e720: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Ne,          0,
e730: 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   6,        0},. 
e740: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
e750: 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53  r,     MAX_PAGES
e760: 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ,0, 0},.      { 
e770: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
e780: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
e790: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
e7a0: 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
e7b0: 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a        "cache_siz
e7c0: 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e"},.      { OP_
e7d0: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
e7e0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
e7f0: 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
e800: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
e810: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
e820: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
e830: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
e840: 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
e850: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e860: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e870: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
e880: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
e890: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
e8a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
e8b0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
e8c0: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
e8d0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
e8e0: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
e8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
e900: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
e910: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
e920: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e930: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69  , OP_Integer, si
e940: 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ze, 0);.      sq
e950: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e960: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
e970: 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 2);.      add
e980: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
e990: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
e9a0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
e9b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e9c0: 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64  v, OP_Ge, 0, add
e9d0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
e9e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e9f0: 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30  P_Negative, 0, 0
ea00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
ea10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ea20: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b  etCookie, 0, 2);
ea30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64  .      sqliteEnd
ea40: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
ea50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62  Parse);.      db
ea60: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64  ->cache_size = d
ea70: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20  b->cache_size<0 
ea80: 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a  ? -size : size;.
ea90: 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
eaa0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
eab0: 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65  ->pBe, db->cache
eac0: 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
ead0: 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
eae0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
eaf0: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
eb00: 20 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20   cache_size=N.  
eb10: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
eb20: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
eb30: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c  he current local
eb40: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65   setting for the
eb50: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
eb60: 20 73 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61   size.  The loca
eb70: 6c 20 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65  l setting can be
eb80: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a   different from.
eb90: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
eba0: 65 6e 74 20 63 61 63 68 65 20 73 69 7a 65 20 76  ent cache size v
ebb0: 61 6c 75 65 20 74 68 61 74 20 69 73 20 73 74 6f  alue that is sto
ebc0: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
ebd0: 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  ase.  ** file it
ebe0: 73 65 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65  self.  The value
ebf0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
ec00: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
ec10: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
ec20: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
ec30: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
ec40: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
ec50: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
ec60: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74   size value.  It
ec70: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
ec80: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a   the persistent.
ec90: 20 20 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20    ** cache size 
eca0: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69  stored on the di
ecb0: 73 6b 20 73 6f 20 74 68 65 20 63 61 63 68 65 20  sk so the cache 
ecc0: 73 69 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74  size will revert
ecd0: 0a 20 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66  .  ** to its def
ece0: 61 75 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20  ault value when 
ecf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ed00: 63 6c 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65  closed and reope
ed10: 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75  ned..  ** N shou
ed20: 6c 64 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  ld be a positive
ed30: 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20   integer..  */. 
ed40: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
ed50: 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f  mp(zLeft,"cache_
ed60: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
ed70: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
ed80: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
ed90: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  {.      { OP_Col
eda0: 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20  umnCount, 1, 0, 
edb0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
edc0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
edd0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
ede0: 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20  "cache_size"},. 
edf0: 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61       { OP_Callba
ee00: 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ck,    1, 0,    
ee10: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
ee20: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
ee30: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
ee40: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
ee50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
ee60: 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c  f( pRight->z==pL
ee70: 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  eft->z ){.      
ee80: 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63  int size = db->c
ee90: 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20  ache_size;;.    
eea0: 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
eeb0: 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
eec0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
eed0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
eee0: 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  , size, 0);.    
eef0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ef00: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
ef10: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
ef20: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b  , getCacheSize);
ef30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ef40: 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f    int size = ato
ef50: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
ef60: 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
ef70: 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
ef80: 20 20 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f    if( db->cache_
ef90: 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20  size<0 ) size = 
efa0: 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d  -size;.      db-
efb0: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
efc0: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
efd0: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
efe0: 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63  e(db->pBe, db->c
eff0: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
f000: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a  }.  }else..  /*.
f010: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
f020: 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73  ault_synchronous
f030: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65  .  **  PRAGMA de
f040: 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75  fault_synchronou
f050: 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20  s=BOOLEAN.  **. 
f060: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
f070: 72 6d 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  rm returns the p
f080: 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65 20  ersistent value 
f090: 6f 66 20 74 68 65 20 22 73 79 6e 63 68 72 6f 6e  of the "synchron
f0a0: 6f 75 73 22 20 73 65 74 74 69 6e 67 0a 20 20 2a  ous" setting.  *
f0b0: 2a 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64  * that is stored
f0c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
f0d0: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 73  .  This is the s
f0e0: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
f0f0: 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 20  ng that.  ** is 
f100: 75 73 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  used whenever th
f110: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
f120: 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f 76 65 72  ened unless over
f130: 72 69 64 64 65 6e 20 62 79 20 61 20 73 65 70 61  ridden by a sepa
f140: 72 61 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63 68  rate.  ** "synch
f150: 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e 20  ronous" pragma. 
f160: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
f170: 20 63 68 61 6e 67 65 73 20 74 68 65 20 70 65 72   changes the per
f180: 73 69 73 74 65 6e 74 20 61 6e 64 20 74 68 65 0a  sistent and the.
f190: 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63 68    ** local synch
f1a0: 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 20 74  ronous setting t
f1b0: 6f 20 74 68 65 20 76 61 6c 75 65 20 67 69 76 65  o the value give
f1c0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  n..  **.  ** If 
f1d0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
f1e0: 6e 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 64  n, SQLite will d
f1f0: 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 73 79 73  o an fsync() sys
f200: 74 65 6d 20 63 61 6c 6c 20 61 74 20 73 74 72 61  tem call at stra
f210: 74 65 67 69 63 0a 20 20 2a 2a 20 70 6f 69 6e 74  tegic.  ** point
f220: 73 20 74 6f 20 69 6e 73 75 72 65 20 74 68 61 74  s to insure that
f230: 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79 20   all previously 
f240: 77 72 69 74 74 65 6e 20 64 61 74 61 20 68 61 73  written data has
f250: 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 0a 20   actually been. 
f260: 20 2a 2a 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f   ** written onto
f270: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
f280: 65 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  e before continu
f290: 69 6e 67 2e 20 20 54 68 69 73 20 6d 6f 64 65 20  ing.  This mode 
f2a0: 69 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 2a  insures that.  *
f2b0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  * the database w
f2c0: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
f2d0: 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
f2e0: 61 74 65 20 65 76 65 6e 74 20 69 66 20 74 68 65  ate event if the
f2f0: 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 2a 2a 20   operating.  ** 
f300: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
f310: 72 20 70 6f 77 65 72 20 74 6f 20 74 68 65 20 63  r power to the c
f320: 6f 6d 70 75 74 65 72 20 69 73 20 69 6e 74 65 72  omputer is inter
f330: 72 75 70 74 65 64 20 75 6e 65 78 70 65 63 74 65  rupted unexpecte
f340: 64 6c 79 2e 0a 20 20 2a 2a 20 57 68 65 6e 20 73  dly..  ** When s
f350: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
f360: 66 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  f, SQLite will n
f370: 6f 74 20 77 61 69 74 20 66 6f 72 20 63 68 61 6e  ot wait for chan
f380: 67 65 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 0a  ges to actually.
f390: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
f3a0: 74 6f 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  to the disk befo
f3b0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  re continuing.  
f3c0: 41 73 20 73 6f 6f 6e 20 61 73 20 69 74 20 68 61  As soon as it ha
f3d0: 6e 64 73 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  nds changes.  **
f3e0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6e   to the operatin
f3f0: 67 20 73 79 73 74 65 6d 2c 20 69 74 20 61 73 73  g system, it ass
f400: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 63 68  umes that the ch
f410: 61 6e 67 65 73 20 61 72 65 20 70 65 72 6d 61 6e  anges are perman
f420: 65 6e 74 20 61 6e 64 0a 20 20 2a 2a 20 69 74 20  ent and.  ** it 
f430: 63 6f 6e 74 69 6e 75 65 73 20 67 6f 69 6e 67 2e  continues going.
f440: 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63    The database c
f450: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
f460: 65 64 20 62 79 20 61 20 70 72 6f 67 72 61 6d 20  ed by a program 
f470: 63 72 61 73 68 0a 20 20 2a 2a 20 65 76 65 6e 20  crash.  ** even 
f480: 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73  with synchronous
f490: 20 6f 66 66 2c 20 62 75 74 20 61 6e 20 6f 70 65   off, but an ope
f4a0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
f4b0: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
f4c0: 73 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 70 6f 74  s.  ** could pot
f4d0: 65 6e 74 69 61 6c 6c 79 20 63 6f 72 72 75 70 74  entially corrupt
f4e0: 20 64 61 74 61 2e 20 20 4f 6e 20 74 68 65 20 6f   data.  On the o
f4f0: 74 68 65 72 20 68 61 6e 64 2c 20 73 79 6e 63 68  ther hand, synch
f500: 72 6f 6e 6f 75 73 20 6f 66 66 20 69 73 0a 20 20  ronous off is.  
f510: 2a 2a 20 66 61 73 74 65 72 20 74 68 61 6e 20 73  ** faster than s
f520: 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e 0a 20  ynchronous on.. 
f530: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
f540: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64  StrICmp(zLeft,"d
f550: 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f  efault_synchrono
f560: 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  us")==0 ){.    s
f570: 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
f580: 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Sync[] = {.     
f590: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
f5a0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
f5b0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
f5c0: 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32  eadCookie,  0, 2
f5d0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f5e0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
f5f0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
f600: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
f610: 5f 4c 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Lt,          0,
f620: 20 35 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   5,        0},. 
f630: 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
f640: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
f650: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
f660: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
f670: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
f680: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
f690: 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
f6a0: 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f        "synchrono
f6b0: 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  us"},.      { OP
f6c0: 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
f6d0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
f6e0: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
f6f0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
f700: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f710: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
f720: 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
f730: 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
f740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f750: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
f760: 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29  raySize(getSync)
f770: 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20  , getSync);.    
f780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
f790: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74   addr;.      int
f7a0: 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68   size = db->cach
f7b0: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  e_size;.      if
f7c0: 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  ( size<0 ) size 
f7d0: 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73  = -size;.      s
f7e0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
f7f0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
f800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
f810: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
f820: 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b  adCookie, 0, 2);
f830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f840: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
f850: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
f860: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
f870: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f880: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
f890: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f8a0: 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 61  p(v, OP_Ne, 0, a
f8b0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
f8c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f8d0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d 41 58 5f   OP_AddImm, MAX_
f8e0: 50 41 47 45 53 2c 20 30 29 3b 0a 20 20 20 20 20  PAGES, 0);.     
f8f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f900: 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c  (v, OP_AbsValue,
f910: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
f920: 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  ( !getBoolean(zR
f930: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ight) ){.       
f940: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f950: 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c  (v, OP_Negative,
f960: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
f970: 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
f980: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f990: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f9a0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
f9b0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f9c0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
f9d0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  n(pParse);.     
f9e0: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
f9f0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
fa00: 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
fa10: 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64  eSize(db->pBe, d
fa20: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
fa30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
fa40: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
fa50: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  A synchronous.  
fa60: 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  **   PRAGMA sync
fa70: 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a  hronous=BOOLEAN.
fa80: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
fa90: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
faa0: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  l value of the s
fab0: 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e  ynchronous flag.
fac0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
fad0: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
fae0: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
faf0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
fb00: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20  k file and the. 
fb10: 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
fb20: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
fb30: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
fb40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
fb50: 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20  .  ** opened..  
fb60: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
fb70: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79  trICmp(zLeft,"sy
fb80: 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29  nchronous")==0 )
fb90: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
fba0: 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20  eOp getSync[] = 
fbb0: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  {.      { OP_Col
fbc0: 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20  umnCount, 1, 0, 
fbd0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
fbe0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
fbf0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
fc00: 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a  "synchronous"},.
fc10: 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
fc20: 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
fc30: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
fc40: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
fc50: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
fc60: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
fc70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
fc80: 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70  if( pRight->z==p
fc90: 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  Left->z ){.     
fca0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fcb0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fcc0: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3e 3d  db->cache_size>=
fcd0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
fce0: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
fcf0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
fd00: 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29  tSync), getSync)
fd10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fd20: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62     int size = db
fd30: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20  ->cache_size;.  
fd40: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
fd50: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
fd60: 20 20 20 20 20 69 66 28 20 21 67 65 74 42 6f 6f       if( !getBoo
fd70: 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 20 73  lean(zRight) ) s
fd80: 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
fd90: 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a     db->cache_siz
fda0: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
fdb0: 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61  sqliteBtreeSetCa
fdc0: 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c  cheSize(db->pBe,
fdd0: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
fde0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
fdf0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
fe00: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 72 69  ICmp(zLeft, "tri
fe10: 67 67 65 72 5f 6f 76 65 72 68 65 61 64 5f 74 65  gger_overhead_te
fe20: 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  st")==0 ){.    i
fe30: 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
fe40: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 61  ight) ){.      a
fe50: 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69 67 67  lways_code_trigg
fe60: 65 72 5f 73 65 74 75 70 20 3d 20 31 3b 0a 20 20  er_setup = 1;.  
fe70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
fe80: 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69 67 67  lways_code_trigg
fe90: 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a 20 20  er_setup = 0;.  
fea0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
feb0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
fec0: 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74 72  (zLeft, "vdbe_tr
fed0: 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ace")==0 ){.    
fee0: 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
fef0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
ff00: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
ff10: 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20  ITE_VdbeTrace;. 
ff20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ff30: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
ff40: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a  LITE_VdbeTrace;.
ff50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
ff60: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
ff70: 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c 5f  mp(zLeft, "full_
ff80: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d 3d  column_names")==
ff90: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
ffa0: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
ffb0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
ffc0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75 6c  gs |= SQLITE_Ful
ffd0: 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d  lColNames;.    }
ffe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
fff0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
10000 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
10010 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
10020 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
10030 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74  p(zLeft, "result
10040 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d  _set_details")==
10050 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
10060 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
10070 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
10080 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73  gs |= SQLITE_Res
10090 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20  ultDetails;.    
100a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
100b0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
100c0 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b  E_ResultDetails;
100d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
100e0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
100f0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e  Cmp(zLeft, "coun
10100 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29  t_changes")==0 )
10110 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
10120 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
10130 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
10140 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  |= SQLITE_CountR
10150 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ows;.    }else{.
10160 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
10170 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74  &= ~SQLITE_Count
10180 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Rows;.    }.  }e
10190 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
101a0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
101b0 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61  "empty_result_ca
101c0 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a  llbacks")==0 ){.
101d0 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
101e0 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
101f0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
10200 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c   SQLITE_NullCall
10210 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  back;.    }else{
10220 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
10230 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c   &= ~SQLITE_Null
10240 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  Callback;.    }.
10250 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
10260 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10270 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22  ft, "table_info"
10280 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  )==0 ){.    Tabl
10290 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62  e *pTab;.    Vdb
102a0 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d  e *v;.    pTab =
102b0 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
102c0 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  (db, zRight);.  
102d0 20 20 69 66 28 20 70 54 61 62 20 29 20 76 20 3d    if( pTab ) v =
102e0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
102f0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
10300 70 54 61 62 20 26 26 20 76 20 29 7b 0a 20 20 20  pTab && v ){.   
10310 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
10320 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
10330 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
10340 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
10350 2c 20 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 5, 0,       0}
10360 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
10370 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
10380 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a  ,       "cid"},.
10390 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
103a0 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
103b0 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
103c0 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
103d0 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20  mnName,  2, 0,  
103e0 20 20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20       "type"},.  
103f0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10400 6e 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20  nName,  3, 0,   
10410 20 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a      "notnull"},.
10420 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10430 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20  umnName,  4, 0, 
10440 20 20 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75        "dflt_valu
10450 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20  e"},.      };.  
10460 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
10470 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10480 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
10490 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  e(tableInfoPrefa
104a0 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72  ce), tableInfoPr
104b0 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71  eface);.      sq
104c0 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
104d0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
104e0 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
104f0 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
10500 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
10510 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10520 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10530 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
10540 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10550 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
10560 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10570 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
10580 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
10590 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  [i].zName, P3_ST
105a0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
105b0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
105c0 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
105d0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
105e0 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
105f0 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
10600 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
10610 7a 54 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43  zType ? pTab->aC
10620 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 74  ol[i].zType : "t
10630 65 78 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ext", P3_STATIC)
10640 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10650 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10660 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61  Integer, pTab->a
10670 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20  Col[i].notNull, 
10680 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10690 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
106a0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
106b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
106c0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
106d0 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  1, pTab->aCol[i]
106e0 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49  .zDflt, P3_STATI
106f0 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
10700 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10710 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30  P_Callback, 5, 0
10720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10730 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
10740 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
10750 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f  eft, "index_info
10760 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  ")==0 ){.    Ind
10770 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
10780 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56  ble *pTab;.    V
10790 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 49 64 78  dbe *v;.    pIdx
107a0 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
107b0 65 78 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a  ex(db, zRight);.
107c0 20 20 20 20 69 66 28 20 70 49 64 78 20 29 20 76      if( pIdx ) v
107d0 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
107e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
107f0 28 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20  ( pIdx && v ){. 
10800 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65       static Vdbe
10810 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  Op tableInfoPref
10820 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ace[] = {.      
10830 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
10840 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20  nt, 3, 0,       
10850 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  0},.        { OP
10860 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
10870 20 30 2c 20 20 20 20 20 20 20 22 73 65 71 6e 6f   0,       "seqno
10880 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
10890 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c  _ColumnName,  1,
108a0 20 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d   0,       "cid"}
108b0 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
108c0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30  olumnName,  2, 0
108d0 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c  ,       "name"},
108e0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
108f0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61  int i;.      pTa
10900 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
10910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
10920 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
10930 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e  rraySize(tableIn
10940 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c  foPreface), tabl
10950 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20  eInfoPreface);. 
10960 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10970 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
10980 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
10990 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69   cnum = pIdx->ai
109a0 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
109b0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
109c0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
109d0 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
109e0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
109f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10a00 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  cnum, 0);.      
10a10 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10a20 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
10a30 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  0, 0);.        a
10a40 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
10a50 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20  l>cnum );.      
10a60 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
10a70 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
10a80 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61  ->aCol[cnum].zNa
10a90 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10ab0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
10ac0 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20  llback, 3, 0);. 
10ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10ae0 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
10af0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
10b00 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d   "index_list")==
10b10 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
10b20 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
10b30 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
10b40 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
10b50 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
10b60 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
10b70 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
10b80 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
10b90 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10ba0 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e     pIdx = pTab->
10bb0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
10bc0 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70 49    if( pTab && pI
10bd0 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  dx && v ){.     
10be0 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
10bf0 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
10c00 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63   indexListPrefac
10c10 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
10c20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
10c30 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 3, 0,       0}
10c40 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
10c50 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
10c60 2c 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a  ,       "seq"},.
10c70 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10c80 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
10c90 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
10ca0 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
10cb0 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20  mnName,  2, 0,  
10cc0 20 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a       "unique"},.
10cd0 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
10ce0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
10cf0 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
10d00 28 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63  (indexListPrefac
10d10 65 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65  e), indexListPre
10d20 66 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69  face);.      whi
10d30 6c 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20  le(pIdx){.      
10d40 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10d50 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10d60 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
10d70 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10d80 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
10d90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10da0 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
10db0 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61  v, -1, pIdx->zNa
10dc0 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
10dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10de0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10df0 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45  teger, pIdx->onE
10e00 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30  rror!=OE_None, 0
10e10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10e20 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10e30 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29  _Callback, 3, 0)
10e40 3b 0a 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20  ;.        ++i;. 
10e50 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 49         pIdx = pI
10e60 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  dx->pNext;.     
10e70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
10e80 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
10e90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10ea0 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72  ICmp(zLeft, "par
10eb0 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  ser_trace")==0 )
10ec0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
10ed0 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72  d sqliteParserTr
10ee0 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20  ace(FILE*, char 
10ef0 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42  *);.    if( getB
10f00 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
10f10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 61  {.      sqlitePa
10f20 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75 74  rserTrace(stdout
10f30 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20  , "parser: ");. 
10f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10f50 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
10f60 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e(0, 0);.    }. 
10f70 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
10f80 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10f90 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67  mp(zLeft, "integ
10fa0 72 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20  rity_check")==0 
10fb0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
10fc0 62 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d  beOp checkDb[] =
10fd0 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65   {.      { OP_Se
10fe0 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c  tInsert,   0, 0,
10ff0 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20          "2"},.  
11000 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20      { OP_Open,  
11010 20 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20        0, 2,     
11020 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
11030 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30  P_Rewind,      0
11040 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 6,        0},.
11050 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11060 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20  n,      0, 3,   
11070 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
11080 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
11090 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
110a0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
110b0 74 2c 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20  t,        0, 3, 
110c0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
110d0 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43   { OP_IntegrityC
110e0 6b 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  k, 0, 0,        
110f0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
11100 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
11110 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
11120 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
11130 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
11140 20 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65    "integrity_che
11150 63 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  ck"},.      { OP
11160 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
11170 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
11180 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
11190 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
111a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
111b0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
111c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
111d0 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
111e0 61 79 53 69 7a 65 28 63 68 65 63 6b 44 62 29 2c  aySize(checkDb),
111f0 20 63 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c   checkDb);.  }el
11200 73 65 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74  se..  {}.  sqlit
11210 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20  eFree(zLeft);.  
11220 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68  sqliteFree(zRigh
11230 74 29 3b 0a 7d 0a                                t);.}.