/ Hex Artifact Content
Login

Artifact 705ebd993ac708bb3d04f4b9019d42dc205408cc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 39 30 20 32 30 30  ild.c,v 1.90 200
0310: 32 2f 30 35 2f 31 35 20 31 32 3a 34 35 3a 34 33  2/05/15 12:45:43
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 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
2eb0: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 74 61 62 2d  er->pNext = tab-
2ec0: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 74  >pTrigger;.    t
2ed0: 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70  ab->pTrigger = p
2ee0: 54 72 69 67 67 65 72 3b 0a 20 20 7d 0a 0a 20 20  Trigger;.  }..  
2ef0: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
2f00: 26 64 62 2d 3e 74 72 69 67 44 72 6f 70 29 3b 0a  &db->trigDrop);.
2f10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2f20: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2f30: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nges;.}../*.** C
2f40: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d  onstruct the nam
2f50: 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c  e of a user tabl
2f60: 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
2f70: 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53  a token..**.** S
2f80: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
2f90: 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65   name is obtaine
2fa0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
2fb0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a  loc() and must.*
2fc0: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
2fd0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2fe0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
2ff0: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
3000: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61  Token(Token *pNa
3010: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
3020: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
3030: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
3040: 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65  me->n);.  sqlite
3050: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
3060: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
3070: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
3080: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
3090: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
30a0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
30b0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
30c0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
30d0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
30e0: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
30f0: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
3100: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
3110: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
3120: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
3130: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3140: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
3150: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
3160: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
3170: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
3180: 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53  name.  The.** pS
3190: 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  tart token is th
31a0: 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61  e CREATE and pNa
31b0: 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  me is the table 
31c0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d  name.  The isTem
31d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
31e0: 65 20 69 66 20 74 68 65 20 22 54 45 4d 50 22 20  e if the "TEMP" 
31f0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
3200: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
3210: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
3220: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
3230: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3240: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3250: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
3260: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
3270: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
3280: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3290: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
32a0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
32b0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
32c0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
32d0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
32e0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
32f0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
3300: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
3310: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
3320: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
3330: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
3340: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
3350: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
3360: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
3370: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
3380: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
3390: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
33a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
33b0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  se, Token *pStar
33c0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  t, Token *pName,
33d0: 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20   int isTemp){.  
33e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
33f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
3400: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
3410: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
3420: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
3430: 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46  v;..  pParse->sF
3440: 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74  irstToken = *pSt
3450: 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  art;.  zName = s
3460: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
3470: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
3480: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
3490: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42   return;..  /* B
34a0: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20  efore trying to 
34b0: 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  create a tempora
34c0: 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73  ry table, make s
34d0: 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f  ure the Btree fo
34e0: 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74  r.  ** holding t
34f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
3500: 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  is open..  */.  
3510: 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62  if( isTemp && db
3520: 2d 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a  ->pBeTemp==0 ){.
3530: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
3540: 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20  iteBtreeOpen(0, 
3550: 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64  0, MAX_PAGES, &d
3560: 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20  b->pBeTemp);.   
3570: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3580: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
3590: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
35a0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
35b0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
35c0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
35d0: 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
35e0: 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
35f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3600: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  ", 0);.      pPa
3610: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3620: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
3630: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
3640: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
3650: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ans ){.      rc 
3660: 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67  = sqliteBtreeBeg
3670: 69 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65 54  inTrans(db->pBeT
3680: 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  emp);.      if( 
3690: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
36b0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
36c0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61  e->zErrMsg, "una
36d0: 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
36e0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
36f0: 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
3700: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
3710: 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ile", 0);.      
3720: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3730: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3750: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
3760: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
3770: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
3780: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
3790: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
37a0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
37b0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
37c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74  or message if it
37d0: 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   does..  **.  **
37e0: 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65   If we are re-re
37f0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
3800: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
3810: 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d  cause of a schem
3820: 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e  a.  ** change an
3830: 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e  d a new permanen
3840: 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64  t table is found
3850: 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c   whose name coll
3860: 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61  ides with.  ** a
3870: 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f  n existing tempo
3880: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
3890: 20 69 67 6e 6f 72 65 20 74 68 65 20 6e 65 77 20   ignore the new 
38a0: 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e  permanent table.
38b0: 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f  .  ** We will co
38c0: 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67 2c 20  ntinue parsing, 
38d0: 62 75 74 20 74 68 65 20 70 50 61 72 73 65 2d 3e  but the pParse->
38e0: 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61 67 20 77  nameClash flag w
38f0: 69 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a 20  ill be set.  ** 
3900: 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  so we will know 
3910: 74 6f 20 64 69 73 63 61 72 64 20 74 68 65 20 74  to discard the t
3920: 61 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63 65  able record once
3930: 20 70 61 72 73 69 6e 67 20 68 61 73 20 66 69 6e   parsing has fin
3940: 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  ished..  */.  pT
3950: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e  able = sqliteFin
3960: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
3970: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  );.  if( pTable!
3980: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  =0 ){.    if( pT
3990: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  able->isTemp && 
39a0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
39b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
39c0: 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b  ->nameClash = 1;
39d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
39e0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
39f0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3a00: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30  Msg, "table ", 0
3a10: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
3a20: 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  e->n,.          
3a30: 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
3a40: 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ", 0, 0);.      
3a50: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
3a60: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3a70: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
3a80: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
3a90: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
3aa0: 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b  ->nameClash = 0;
3ab0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78  .  }.  if( (pIdx
3ac0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
3ad0: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d  ex(db, zName))!=
3ae0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28  0 &&.          (
3af0: 21 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  !pIdx->pTable->i
3b00: 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65  sTemp || !pParse
3b10: 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20  ->initFlag) ){. 
3b20: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3b30: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3b40: 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61  Msg, "there is a
3b50: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
3b60: 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20  named ", .      
3b70: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
3b80: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
3b90: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
3ba0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
3bb0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
3bc0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3bd0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
3be0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
3bf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3c00: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
3c10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
3c20: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
3c30: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  me;.  pTable->nC
3c40: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
3c50: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
3c60: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
3c70: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
3c80: 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ex = 0;.  pTable
3c90: 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73 54 65 6d  ->isTemp = isTem
3ca0: 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  p;.  if( pParse-
3cb0: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
3cc0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64  iteDeleteTable(d
3cd0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b, pParse->pNewT
3ce0: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
3cf0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
3d00: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ble;..  /* Begin
3d10: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
3d20: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
3d30: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
3d40: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
3d50: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
3d60: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
3d70: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
3d80: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
3d90: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
3da0: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
3db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3dc0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
3dd0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
3de0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
3df0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
3e00: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
3e10: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
3e20: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
3e30: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
3e40: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
3e50: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
3e60: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
3e70: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
3e80: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
3e90: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
3ea0: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
3eb0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
3ec0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
3ed0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20  se->initFlag && 
3ee0: 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  (v = sqliteGetVd
3ef0: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
3f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  {.    sqliteBegi
3f10: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
3f20: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
3f30: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
3f40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3f50: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3f60: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
3f70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3f80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3f90: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
3fa0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
3fb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3fc0: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32 29  OpenWrite, 0, 2)
3fd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3fe0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
3ff0: 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50  , MASTER_NAME, P
4000: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
4010: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4020: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
4030: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
4040: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4050: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
4060: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4070: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
4080: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
4090: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
40a0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
40b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
40c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
40d0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
40e0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
40f0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
4100: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
4110: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
4120: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
4130: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4140: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
4150: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
4160: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
4170: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 29 20  iteStartTable() 
4180: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
4190: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
41a0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
41b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
41c0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
41d0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
41e0: 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75  id sqliteAddColu
41f0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
4200: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4210: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63  .  Table *p;.  c
4220: 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20  har **pz;.  if( 
4230: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
4240: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
4250: 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e  urn;.  if( (p->n
4260: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
4270: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
4280: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
4290: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
42a0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
42b0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
42c0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
42d0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
42e0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
42f0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  New;.  }.  memse
4300: 74 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  t(&p->aCol[p->nC
4310: 6f 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ol], 0, sizeof(p
4320: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
4330: 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  z = &p->aCol[p->
4340: 6e 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol++].zName;. 
4350: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4360: 67 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  g(pz, pName->z, 
4370: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
4380: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
4390: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  z);.}../*.** Thi
43a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
43b0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
43c0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
43d0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
43e0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
43f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
4400: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
4410: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
4420: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
4430: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
4440: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
4450: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
4460: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
4470: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
4480: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
4490: 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c  sqliteAddNotNull
44a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
44b0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
44c0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
44d0: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
44e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
44f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4500: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4510: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
4520: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
4530: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
4540: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4550: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4560: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4570: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4580: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4590: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
45a0: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
45b0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
45c0: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
45d0: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
45e0: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
45f0: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
4600: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
4610: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
4620: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
4630: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
4640: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
4650: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
4660: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
4670: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
4680: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
4690: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
46a0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
46b0: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
46c0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
46d0: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
46e0: 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70  liteAddColumnTyp
46f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4700: 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20   Token *pFirst, 
4710: 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20  Token *pLast){. 
4720: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
4730: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a   i, j;.  int n;.
4740: 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b    char *z, **pz;
4750: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
4760: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
4770: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
4780: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
4790: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
47a0: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
47b0: 5b 69 5d 2e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d  [i].zType;.  n =
47c0: 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72   pLast->n + Addr
47d0: 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64  (pLast->z) - Add
47e0: 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20  r(pFirst->z);.  
47f0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4800: 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20  (pz, pFirst->z, 
4810: 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a  n, 0);.  z = *pz
4820: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
4830: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a  eturn;.  for(i=j
4840: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
4850: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d      int c = z[i]
4860: 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  ;.    if( isspac
4870: 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e(c) ) continue;
4880: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b  .    z[j++] = c;
4890: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
48a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69  .}../*.** The gi
48b0: 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  ven token is the
48c0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
48d0: 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  or the last colu
48e0: 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  mn added to.** t
48f0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
4900: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
4910: 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75  ction.  If "minu
4920: 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20  sFlag" is true, 
4930: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
4940: 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20  value token was 
4950: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
4960: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20  nus sign..**.** 
4970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4980: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
4990: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
49a0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
49b0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
49c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
49d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
49e0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
49f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4a00: 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d  ken *pVal, int m
4a10: 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62  inusFlag){.  Tab
4a20: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
4a30: 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69    char **pz;.  i
4a40: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4a50: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4a60: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
4a70: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
4a80: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
4a90: 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  z = &p->aCol[i].
4aa0: 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e  zDflt;.  if( min
4ab0: 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  usFlag ){.    sq
4ac0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
4ad0: 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d  z, "-", 1, pVal-
4ae0: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
4af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4b00: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
4b10: 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  z, pVal->z, pVal
4b20: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ->n, 0);.  }.  s
4b30: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
4b40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
4b50: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
4b60: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
4b70: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
4b80: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
4b90: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
4ba0: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
4bb0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
4bc0: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
4bd0: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
4be0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
4bf0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
4c00: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
4c10: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
4c20: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
4c30: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
4c40: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
4c50: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
4c60: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
4c70: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
4c80: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
4c90: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
4ca0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
4cb0: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
4cc0: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
4cd0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
4ce0: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
4cf0: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
4d00: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
4d10: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
4d20: 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45   the row id.  (E
4d30: 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72  xception:.** For
4d40: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
4d50: 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
4d60: 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20 64  der databases, d
4d70: 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a  o not do this.**
4d80: 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   if the file for
4d90: 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  mat version numb
4da0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
4db0: 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61 62  1.)  Set the Tab
4dc0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
4dd0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
4de0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4df0: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
4e00: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
4e10: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
4e20: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
4e30: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
4e40: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
4e50: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
4e60: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
4e70: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
4e80: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
4e90: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
4ea0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
4eb0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
4ec0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
4ed0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
4ee0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4ef0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4f00: 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50  eAddPrimaryKey(P
4f10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64  arse *pParse, Id
4f20: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
4f30: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
4f40: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
4f50: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
4f60: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
4f70: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
4f80: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
4f90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4fa0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
4fb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
4fc0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
4fd0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
4fe0: 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   \"", pTab->zNam
4ff0: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22 20  e, .        "\" 
5000: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
5010: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
5020: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
5030: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
5040: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  rn;.  }.  pTab->
5050: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
5060: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5070: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
5080: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d  b->nCol - 1;.  }
5090: 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
50a0: 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f  nId==1 ){.    fo
50b0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
50c0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
50d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
50e0: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
50f0: 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[0].zName, p
5100: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5110: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
5120: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
5130: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
5140: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
5150: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
5160: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5170: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ype;.  }.  if( p
5180: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
5190: 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20  format>=1 && .  
51a0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 26           zType &
51b0: 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  & sqliteStrICmp(
51c0: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
51d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
51e0: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
51f0: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
5200: 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d  f = onError;.  }
5210: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
5220: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
5230: 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c  se, 0, 0, pList,
5240: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
5250: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
5260: 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77  me up with a new
5270: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f   random value fo
5280: 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  r the schema coo
5290: 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a  kie.  Make sure.
52a0: 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ** the new value
52b0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
52c0: 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a  om the old..**.*
52d0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
52e0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
52f0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
5300: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
5310: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
5320: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
5330: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
5340: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
5350: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
5360: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
5370: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
5380: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
5390: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
53a0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
53b0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
53c0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
53d0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
53e0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
53f0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
5400: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
5410: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
5420: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
5430: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
5440: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
5450: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
5460: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
5470: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
5480: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
5490: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
54a0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
54b0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
54c0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
54d0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
54e0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
54f0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
5500: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
5510: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
5520: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
5530: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
5540: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
5550: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
5560: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61  /.void sqliteCha
5570: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
5580: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
5590: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62  >next_cookie==db
55a0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ->schema_cookie 
55b0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  ){.    db->next_
55c0: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
55d0: 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c  ema_cookie + sql
55e0: 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20  iteRandomByte() 
55f0: 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  + 1;.    db->fla
5600: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
5610: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
5620: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
5630: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5640: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
5650: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
5660: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
5670: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
5680: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
5690: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
56a0: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
56b0: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
56c0: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
56d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
56e0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
56f0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
5700: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
5710: 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30  e = 0;.  for(n=0
5720: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
5730: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27  .    if( *z=='\'
5740: 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75  ' ){ n++; needQu
5750: 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  ote=1; }.  }.  r
5760: 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75  eturn n + needQu
5770: 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ote*2;.}../*.** 
5780: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
5790: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
57a0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
57b0: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
57c0: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
57d0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
57e0: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
57f0: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
5800: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65  pIdx, char *zIde
5810: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  nt){.  int i, j,
5820: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
5830: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
5840: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
5850: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
5860: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
5870: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
5880: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
5890: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
58a0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
58b0: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
58c0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
58d0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79      || sqliteKey
58e0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
58f0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
5900: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
5910: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66  i++] = '\'';.  f
5920: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
5930: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
5940: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
5950: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
5960: 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b  j]=='\'' ) z[i++
5970: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
5980: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
5990: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
59a0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
59b0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
59c0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
59d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
59e0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
59f0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
5a00: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
5a10: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
5a20: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
5a30: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
5a40: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5a50: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
5a60: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
5a70: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
5a80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
5a90: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
5aa0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
5ab0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
5ac0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
5ad0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
5ae0: 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  End;.  n = 0;.  
5af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
5b00: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ol; i++){.    n 
5b10: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
5b20: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
5b30: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
5b40: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
5b50: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29  e);.  if( n<40 )
5b60: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
5b70: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
5b80: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
5b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
5ba0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
5bb0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
5bc0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
5bd0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
5be0: 32 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  25 + 6*p->nCol;.
5bf0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
5c00: 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69  Malloc( n );.  i
5c10: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
5c20: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
5c30: 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 3b 0a  ( !p->isTemp );.
5c40: 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20    strcpy(zStmt, 
5c50: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
5c60: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
5c70: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
5c80: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
5c90: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
5ca0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
5cb0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
5cc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63  ; i++){.    strc
5cd0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  py(&zStmt[k], zS
5ce0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
5cf0: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
5d00: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
5d10: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
5d20: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43  zStmt, &k, p->aC
5d30: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
5d40: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
5d50: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
5d60: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
5d70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5d80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
5d90: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
5da0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
5db0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
5dc0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5dd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
5de0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
5df0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
5e00: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
5e10: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
5e20: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
5e30: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
5e40: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
5e50: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
5e60: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
5e70: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
5e80: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
5e90: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
5ea0: 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c   on disk,.** unl
5eb0: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 74 65  ess this is a te
5ec0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
5ed0: 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57   initFlag==1.  W
5ee0: 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c  hen initFlag==1,
5ef0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
5f00: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
5f10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5f20: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
5f30: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
5f40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
5f50: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
5f60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5f70: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
5f80: 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20  tly changes, so 
5f90: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
5fa0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
5fb0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
5fc0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
5fd0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
5fe0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
5ff0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
6000: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
6010: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
6020: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
6030: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
6040: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
6050: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
6060: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
6070: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
6080: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
6090: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
60a0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
60b0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
60c0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
60d0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
60e0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
60f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
6100: 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  ndTable(Parse *p
6110: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45  Parse, Token *pE
6120: 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  nd, Select *pSel
6130: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
6140: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
6150: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
6160: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
6170: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70  pSelect==0) || p
6180: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
6190: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
61a0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
61b0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
61c0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
61d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
61e0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
61f0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
6200: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6210: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
6220: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
6230: 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73  pParse->nameClas
6240: 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  h==0 || pParse->
6250: 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  initFlag==1 );. 
6260: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
6270: 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73  lain==0 && pPars
6280: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20  e->nameClash==0 
6290: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
62a0: 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ld;.    pOld = s
62b0: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
62c0: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  &db->tblHash, p-
62d0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
62e0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
62f0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
6300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
6310: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
6320: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
6330: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
6340: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
6350: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6360: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
6370: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
6380: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
6390: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
63a0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
63b0: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  es;.  }..  /* If
63c0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 67 65   the table is ge
63d0: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53  nerated from a S
63e0: 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73  ELECT, then cons
63f0: 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c  truct the.  ** l
6400: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61  ist of columns a
6410: 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  nd the text of t
6420: 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  he table..  */. 
6430: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
6440: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
6450: 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c  ab = sqliteResul
6460: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
6470: 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29  rse, 0, pSelect)
6480: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
6490: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
64a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
64b0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ol==0 );.    p->
64c0: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
64d0: 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  nCol;.    p->aCo
64e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
64f0: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
6500: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
6510: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
6520: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
6530: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
6540: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  b);.  }..  /* If
6550: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
6560: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
6570: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
6580: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
6590: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
65a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
65b0: 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72  k.  So do not wr
65c0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a  ite to the disk.
65d0: 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74    ** again.  Ext
65e0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
65f0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
6600: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
6610: 20 0a 20 20 2a 2a 20 70 50 61 72 73 65 2d 3e 6e   .  ** pParse->n
6620: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
6630: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
6640: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
6650: 20 70 75 74 0a 20 20 2a 2a 20 74 68 65 72 65 20   put.  ** there 
6660: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
6670: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
6680: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
6690: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
66a0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73   p->tnum = pPars
66b0: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
66c0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
66d0: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
66e0: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
66f0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
6700: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
6710: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
6720: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6730: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
6740: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
6750: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
6760: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
6770: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
6780: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
6790: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
67a0: 41 52 59 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ARY table, then 
67b0: 6a 75 73 74 20 63 72 65 61 74 65 20 74 68 65 20  just create the 
67c0: 74 61 62 6c 65 2e 20 20 44 6f 20 6e 6f 74 0a 20  table.  Do not. 
67d0: 20 2a 2a 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72   ** make an entr
67e0: 79 20 69 6e 20 53 51 4c 49 54 45 5f 4d 41 53 54  y in SQLITE_MAST
67f0: 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ER..  */.  if( !
6800: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
6810: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
6820: 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20     Vdbe *v;..   
6830: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
6840: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
6850: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
6860: 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  n;.    if( p->pS
6870: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
6880: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
6890: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  able */.      sq
68a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
68b0: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
68c0: 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a   0, p->isTemp);.
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
68e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
68f0: 28 63 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d  (char *)&p->tnum
6900: 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
6910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6920: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
6930: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6940: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
6950: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
6960: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a     p->tnum = 0;.
6970: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54 65      if( !p->isTe
6980: 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mp ){.      sqli
6990: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
69a0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
69b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
69c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
69d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
69e0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
69f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
6a00: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6a10: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
6a20: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6a40: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6a50: 65 50 33 28 76 2c 20 2d 31 2c 20 22 76 69 65 77  eP3(v, -1, "view
6a60: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
6a70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6a80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6a90: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6aa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6ab0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6ac0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
6ad0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
6ae0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6af0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
6b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6b10: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6b20: 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  1, p->zName, P3_
6b30: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
6b40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6b50: 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b  , OP_Dup, 4, 0);
6b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6b70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
6b80: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
6b90: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
6ba0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6bb0: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
6bc0: 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6e  mt(p);.        n
6bd0: 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29   = z ? strlen(z)
6be0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   : 0;.        sq
6bf0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6c00: 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  (v, -1, z, n);. 
6c10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
6c20: 65 28 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(z);.      }els
6c30: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
6c40: 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
6c50: 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70        n = Addr(p
6c60: 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  End->z) - Addr(p
6c70: 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b  Parse->sFirstTok
6c80: 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  en.z) + 1;.     
6c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6ca0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP3(v, -1, pPa
6cb0: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
6cc0: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  .z, n);.      }.
6cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6ce0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
6cf0: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
6d00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
6d20: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
6d30: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
6d40: 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20  ookie(db);.     
6d50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6d60: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6d70: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c  db->next_cookie,
6d80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6d90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6da0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30  _SetCookie, 0, 0
6db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6dc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6dd0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
6de0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65   }.    if( pSele
6df0: 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ct ){.      int 
6e00: 6f 70 20 3d 20 70 2d 3e 69 73 54 65 6d 70 20 3f  op = p->isTemp ?
6e10: 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20   OP_OpenWrAux : 
6e20: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
6e30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6e40: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 30 29  dOp(v, op, 1, 0)
6e50: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6e60: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
6e70: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
6e80: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
6e90: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
6ea0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6eb0: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
6ec0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
6ed0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6ee0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
6ef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
6f00: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
6f10: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
6f20: 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 56 69  d sqliteCreateVi
6f30: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
6f40: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
6f50: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
6f60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
6f70: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
6f80: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
6f90: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
6fa0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
6fb0: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a   *pName,      /*
6fc0: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
6fd0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
6fe0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
6ff0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
7000: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
7010: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
7020: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
7030: 77 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  w view */.){.  T
7040: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 54 61 62  oken sEnd;.  Tab
7050: 6c 65 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63  le *p;.  const c
7060: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 2c  har *z;.  int n,
7070: 20 6f 66 66 73 65 74 3b 0a 0a 20 20 73 71 6c 69   offset;..  sqli
7080: 74 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  teStartTable(pPa
7090: 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61  rse, pBegin, pNa
70a0: 6d 65 2c 20 30 29 3b 0a 20 20 70 20 3d 20 70 50  me, 0);.  p = pP
70b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
70c0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
70d0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
70e0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
70f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7100: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 4f 52 44 45    /* Ignore ORDE
7110: 52 20 42 59 20 63 6c 61 75 73 65 73 20 6f 6e 20  R BY clauses on 
7120: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  a SELECT */.  if
7130: 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  ( pSelect->pOrde
7140: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
7150: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
7160: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
7170: 79 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d  y);.    pSelect-
7180: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
7190: 20 7d 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20   }.  p->pSelect 
71a0: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  = pSelect;.  if(
71b0: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
71c0: 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ag ){.    if( sq
71d0: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
71e0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
71f0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
7200: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  n;.    }.  }.  s
7210: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
7220: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
7230: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
7240: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
7250: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
7260: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
7270: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
7280: 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20  ((int)sEnd.z) - 
7290: 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  (int)pBegin->z;.
72a0: 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
72b0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
72c0: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
72d0: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
72e0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
72f0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
7300: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 20 20    sEnd.n = 1;.  
7310: 7a 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e  z = p->pSelect->
7320: 7a 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  zSelect = sqlite
7330: 53 74 72 4e 44 75 70 28 7a 2c 20 6e 29 3b 0a 20  StrNDup(z, n);. 
7340: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 6f 66   if( z ){.    of
7350: 66 73 65 74 20 3d 20 28 28 69 6e 74 29 7a 29 20  fset = ((int)z) 
7360: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
7370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  ;.    sqliteSele
7380: 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d  ctMoveStrings(p-
7390: 3e 70 53 65 6c 65 63 74 2c 20 6f 66 66 73 65 74  >pSelect, offset
73a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64  );.    sqliteEnd
73b0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73  Table(pParse, &s
73c0: 45 6e 64 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  End, 0);.  }.  r
73d0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
73e0: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
73f0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
7400: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
7410: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
7420: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
7430: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
7440: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
7450: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
7460: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
7470: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
7480: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
7490: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
74a0: 61 67 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45  age in pPare->zE
74b0: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
74c0: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
74d0: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
74e0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
74f0: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
7500: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
7510: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
7520: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
7530: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
7540: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
7550: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
7560: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
7570: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
7580: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
7590: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
75a0: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
75b0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
75c0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
75d0: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
75e0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
75f0: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
7600: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
7610: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
7620: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
7630: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
7640: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
7650: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
7660: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
7670: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
7680: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
7690: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
76a0: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
76b0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
76c0: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
76d0: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
76e0: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
76f0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
7700: 4d 20 6f 6e 65 3b 0a 20 20 2a 2f 0a 20 20 69 66  M one;.  */.  if
7710: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
7720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
7730: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
7740: 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 20  >zErrMsg, "view 
7750: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
7760: 2c 0a 20 20 20 20 20 20 20 20 20 22 20 69 73 20  ,.         " is 
7770: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
7780: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
7790: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
77a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
77b0: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
77c0: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
77d0: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
77e0: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
77f0: 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ames..  */.  ass
7800: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
7810: 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43  lect ); /* If nC
7820: 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62  ol==0, then pTab
7830: 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45  le must be a VIE
7840: 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54  W */.  pSel = pT
7850: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  able->pSelect;..
7860: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    /* Note that t
7870: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
7880: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
7890: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
78a0: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
78b0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
78c0: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
78d0: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
78e0: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
78f0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
7900: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
7910: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
7920: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
7930: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
7940: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
7950: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
7960: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
7970: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
7980: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
7990: 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  p(pEList);.  if(
79a0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30   pSel->pEList==0
79b0: 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45   ){.    pSel->pE
79c0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
79d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a     return 1;  /*
79e0: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a   Malloc failed *
79f0: 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  /.  }.  pTable->
7a00: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65  nCol = -1;.  pSe
7a10: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73  lTab = sqliteRes
7a20: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
7a30: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
7a40: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
7a50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
7a60: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
7a70: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
7a80: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
7a90: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
7aa0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
7ab0: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
7ac0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
7ad0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
7ae0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  0;.    sqliteDel
7af0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
7b00: 54 61 62 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Tab);.    pParse
7b10: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53  ->db->flags |= S
7b20: 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65  QLITE_UnresetVie
7b30: 77 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ws;.  }else{.   
7b40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
7b50: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
7b60: 20 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63   }.  sqliteSelec
7b70: 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20  tUnbind(pSel);. 
7b80: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
7b90: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
7ba0: 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  st);.  pSel->pEL
7bb0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
7bc0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
7bd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
7be0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
7bf0: 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61  rom the VIEW pTa
7c00: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
7c10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7c20: 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f  d whenever any o
7c30: 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69  ther table or vi
7c40: 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a  ew is modified..
7c50: 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73  ** The view pass
7c60: 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
7c70: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e  tine might depen
7c80: 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  d directly or in
7c90: 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74  directly.** on t
7ca0: 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64  he modified or d
7cb0: 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20  eleted table so 
7cc0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  we need to clear
7cd0: 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a   the old column.
7ce0: 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74  ** names so that
7cf0: 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
7d00: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
7d10: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
7d20: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
7d30: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
7d40: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
7d50: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  f( pTable==0 || 
7d60: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d  pTable->pSelect=
7d70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7d80: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  f( pTable->nCol=
7d90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
7da0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
7db0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7dc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
7dd0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
7de0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
7df0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
7e00: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
7e10: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
7e20: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
7e30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
7e40: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
7e50: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
7e60: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
7e70: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
7e80: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
7e90: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
7ea0: 65 76 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76  every VIEW..*/.v
7eb0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
7ec0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
7ed0: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
7ee0: 69 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  i;.  if( (db->fl
7ef0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72  ags & SQLITE_Unr
7f00: 65 73 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20  esetViews)==0 ) 
7f10: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7f20: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7f30: 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  &db->tblHash); i
7f40: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
7f50: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
7f60: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
7f70: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
7f80: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
7f90: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
7fa0: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
7fb0: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
7fc0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c    }.  }.  db->fl
7fd0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55  ags &= ~SQLITE_U
7fe0: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a  nresetViews;.}..
7ff0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
8000: 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74  ken, look up a t
8010: 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e  able with that n
8020: 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75  ame.  If not fou
8030: 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20  nd, leave.** an 
8040: 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61  error for the pa
8050: 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64  rser to find and
8060: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
8070: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61  .Table *sqliteTa
8080: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72  bleFromToken(Par
8090: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
80a0: 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72  n *pTok){.  char
80b0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65   *zName;.  Table
80c0: 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20   *pTab;.  zName 
80d0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
80e0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29  eFromToken(pTok)
80f0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8100: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8110: 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
8120: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8130: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
8140: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
8150: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
8160: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
8170: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8180: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
8190: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
81a0: 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70        pTok->z, p
81b0: 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  Tok->n, 0);.    
81c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
81d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
81e0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
81f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8200: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
8210: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
8220: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
8230: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
8240: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
8250: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
8260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70  .void sqliteDrop
8270: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
8280: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
8290: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  e, int isView){.
82a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
82b0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
82c0: 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  t base;.  sqlite
82d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
82e0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
82f0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
8300: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
8310: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
8320: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46  e = sqliteTableF
8330: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  romToken(pParse,
8340: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   pName);.  if( p
8350: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
8360: 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  n;.  if( pTable-
8370: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
8380: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
8390: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
83a0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
83b0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  ble->zName, .   
83c0: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
83d0: 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
83e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
83f0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
8400: 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77 20   }.  if( isView 
8410: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
8420: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
8430: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
8440: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8450: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
8460: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22  o delete table "
8470: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
8480: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
8490: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
84a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
84b0: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
84c0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
84d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
84e0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
84f0: 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52  zErrMsg, "use DR
8500: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
8510: 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20  e view ",.      
8520: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
8530: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8540: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
8550: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  n;.  }..  /* Gen
8560: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
8570: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
8580: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
8590: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
85a0: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
85b0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
85c0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
85d0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
85e0: 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20  p dropTable[] = 
85f0: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  {.      { OP_Ope
8600: 6e 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20  nWrite,  0, 2,  
8610: 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d        MASTER_NAM
8620: 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  E},.      { OP_R
8630: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
8640: 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(9),  0},.    
8650: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
8660: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
8670: 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20  0}, /* 2 */.    
8680: 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c    { OP_MemStore,
8690: 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20     1, 1,        
86a0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
86b0: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
86c0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34          0}, /* 4
86d0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
86e0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c  olumn,     0, 2,
86f0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
8700: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
8710: 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20     0, ADDR(8),  
8720: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
8730: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
8740: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
8750: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
8760: 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20 20     0, ADDR(4),  
8770: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
8780: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
8790: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
87a0: 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20  0}, /* 9 */.    
87b0: 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65    { OP_SetCookie
87c0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
87d0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
87e0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c  lose,      0, 0,
87f0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
8800: 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  };.    Index *pI
8810: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65  dx;.    sqliteBe
8820: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
8830: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 2f  n(pParse);.    /
8840: 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
8850: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
8860: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
8870: 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20  ing dropped */. 
8880: 20 20 20 77 68 69 6c 65 28 20 70 54 61 62 6c 65     while( pTable
8890: 2d 3e 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ->pTrigger ){.  
88a0: 20 20 20 20 54 6f 6b 65 6e 20 74 74 3b 0a 20 20      Token tt;.  
88b0: 20 20 20 20 74 74 2e 7a 20 3d 20 70 54 61 62 6c      tt.z = pTabl
88c0: 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  e->pTrigger->nam
88d0: 65 3b 0a 20 20 20 20 20 20 74 74 2e 6e 20 3d 20  e;.      tt.n = 
88e0: 73 74 72 6c 65 6e 28 70 54 61 62 6c 65 2d 3e 70  strlen(pTable->p
88f0: 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a  Trigger->name);.
8900: 20 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70        sqliteDrop
8910: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
8920: 26 74 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  &tt, 1);.    }. 
8930: 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e     if( !pTable->
8940: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
8950: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
8960: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
8970: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
8980: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
8990: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
89a0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
89b0: 2b 32 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  +2, pTable->zNam
89c0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
89d0: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
89e0: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
89f0: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
8a00: 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78   base+9, db->nex
8a10: 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  t_cookie);.    }
8a20: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
8a30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8a40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8a50: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
8a60: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
8a70: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  sTemp);.      fo
8a80: 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70  r(pIdx=pTable->p
8a90: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
8aa0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
8ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8ac0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
8ad0: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
8ae0: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
8af0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
8b00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  }.    sqliteEndW
8b10: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8b20: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
8b30: 20 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20   Move the table 
8b40: 28 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64  (and all its ind
8b50: 69 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e  ices) to the pen
8b60: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e  ding DROP queue.
8b70: 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
8b80: 20 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72   table was never
8b90: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74   committed, just
8ba0: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20   delete it.  If 
8bb0: 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
8bc0: 61 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  as been committe
8bd0: 64 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20  d and is placed 
8be0: 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  on the pending D
8bf0: 52 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20  ROP queue, then 
8c00: 74 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  the.  ** delete 
8c10: 77 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20  will occur when 
8c20: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
8c30: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78  rnalChanges() ex
8c40: 65 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ecutes..  **.  *
8c50: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
8c60: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
8c70: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
8c80: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
8c90: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
8ca0: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
8cb0: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
8cc0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
8cd0: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
8ce0: 50 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65  PendingDropTable
8cf0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
8d00: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
8d10: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
8d20: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
8d30: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
8d40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
8d50: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
8d60: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
8d70: 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20    pIndex is the 
8d80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
8d90: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65  x .** and pTable
8da0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8db0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
8dc0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
8dd0: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
8de0: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
8df0: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
8e00: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
8e10: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
8e20: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
8e30: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
8e40: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
8e50: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
8e60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
8e70: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
8e80: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
8e90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8ea0: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
8eb0: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
8ec0: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8ed0: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
8ee0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
8ef0: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
8f00: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
8f10: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
8f20: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
8f30: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
8f40: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
8f50: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
8f60: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
8f70: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
8f80: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
8f90: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8fa0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8fb0: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
8fc0: 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a  iteCreateIndex(.
8fd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8fe0: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
8ff0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
9000: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
9010: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
9020: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
9030: 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  x.  May be NULL 
9040: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
9050: 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  le,   /* Name of
9060: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e   the table to in
9070: 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65  dex.  Use pParse
9080: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
9090: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c   */.  IdList *pL
90a0: 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
90b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
90c0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
90d0: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
90e0: 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
90f0: 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
9100: 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
9110: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
9120: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
9130: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
9140: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
9150: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
9160: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
9170: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
9180: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
9190: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
91a0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
91b0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
91c0: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
91d0: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
91e0: 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54   *pIndex;   /* T
91f0: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
9200: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
9210: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
9220: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
9230: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
9240: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
9250: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
9260: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c  ID list */.  sql
9270: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
9280: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65  ->db;.  int hide
9290: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
92a0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20    /* Do not put 
92b0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
92c0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
92d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
92e0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
92f0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
9300: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
9310: 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
9320: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
9330: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
9340: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
9350: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
9360: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
9370: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61  able!=0 ){.    a
9380: 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20  ssert( pName!=0 
9390: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73  );.    pTab =  s
93a0: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
93b0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ken(pParse, pTab
93c0: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
93d0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
93e0: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
93f0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
9400: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
9410: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
9420: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
9430: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9440: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
9450: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
9460: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
9470: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
9480: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
9490: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
94a0: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20  ay not have new 
94b0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
94c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
94d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
94e0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
94f0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
9500: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
9510: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
9520: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
9530: 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20  Msg, "views may 
9540: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
9550: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
9560: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
9570: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9580: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
9590: 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
95a0: 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65  created while re
95b0: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68  -reading the sch
95c0: 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ema from sqlite_
95d0: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20  master.  ** but 
95e0: 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  the table associ
95f0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
9600: 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72  ndex is a tempor
9610: 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61  ary table, it ca
9620: 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e  n.  ** only mean
9630: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
9640: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
9650: 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69  is really associ
9660: 61 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a  ated with is.  *
9670: 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65  * one whose name
9680: 20 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e   is hidden behin
9690: 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  d a temporary ta
96a0: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
96b0: 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e  e name..  ** Sin
96c0: 63 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73  ce its table has
96d0: 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64   been suppressed
96e0: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73  , we need to als
96f0: 6f 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20  o suppress the. 
9700: 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   ** index..  */.
9710: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
9720: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d 3e  itFlag && pTab->
9730: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f  isTemp ){.    go
9740: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
9750: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
9760: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
9770: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
9780: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
9790: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
97a0: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
97b0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
97c0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
97d0: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
97e0: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
97f0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
9800: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
9810: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
9820: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
9830: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
9840: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
9850: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
9860: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
9870: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
9880: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
9890: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
98a0: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
98b0: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
98c0: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
98d0: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
98e0: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
98f0: 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20  ex, but we will 
9900: 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69  not.  ** store i
9910: 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68  ts name in the h
9920: 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20  ash table.  Set 
9930: 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61  the hideName fla
9940: 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a  g to accomplish.
9950: 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a    ** this..  **.
9960: 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
9970: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
9980: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
9990: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
99a0: 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
99b0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
99c0: 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
99d0: 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
99e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
99f0: 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  me ){.    Index 
9a00: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
9a10: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
9a20: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
9a30: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
9a40: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
9a50: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
9a60: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
9a70: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
9a80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
9a90: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
9aa0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
9ab0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
9ac0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9ad0: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
9ae0: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
9af0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
9b00: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
9b10: 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d   if( pISameName-
9b20: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
9b30: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
9b40: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
9b50: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
9b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9b70: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
9b80: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
9b90: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
9ba0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
9bb0: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
9bc0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  s", 0);.        
9bd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9be0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
9bf0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9c10: 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d    if( (pTSameNam
9c20: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
9c30: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  ble(db, zName))!
9c40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9c50: 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65  pTSameName->isTe
9c60: 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  mp && pParse->in
9c70: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  itFlag ){.      
9c80: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a    hideName = 1;.
9c90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9ca0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
9cb0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9cc0: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
9cd0: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
9ce0: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
9cf0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
9d00: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9d10: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
9d20: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9d30: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
9d40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9d50: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
9d60: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
9d70: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
9d80: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
9d90: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
9da0: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
9db0: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
9dc0: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
9dd0: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
9de0: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
9df0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9e00: 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61  &zName, "(", pTa
9e10: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f  b->zName, " auto
9e20: 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30  index ", zBuf, 0
9e30: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
9e40: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9e50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9e60: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c    hideName = sql
9e70: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
9e80: 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a   zName)!=0;.  }.
9e90: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
9ea0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
9eb0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
9ec0: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
9ed0: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
9ee0: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
9ef0: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
9f00: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
9f10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
9f20: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
9f30: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
9f40: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
9f50: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
9f60: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
9f70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
9f80: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
9f90: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
9fa0: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
9fb0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
9fc0: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
9fd0: 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
9fe0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
9ff0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
a000: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
a010: 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
a020: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
a030: 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
a040: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
a050: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
a060: 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
a070: 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69   sizeof(int)*pLi
a0a0: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
a0b0: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
a0c0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
a0d0: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
a0e0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
a0f0: 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49  &pIndex[1];.  pI
a100: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
a110: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
a120: 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49  Column[pList->nI
a130: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
a140: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
a150: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
a160: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
a170: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
a180: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70   pList->nId;.  p
a190: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
a1a0: 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75   pIndex->isUniqu
a1b0: 65 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20  e = onError;..  
a1c0: 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
a1d0: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
a1e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
a1f0: 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
a200: 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
a210: 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
a220: 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
a230: 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
a240: 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
a250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
a260: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
a270: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
a280: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
a290: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
a2a0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
a2b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
a2c0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
a2d0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
a2e0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
a2f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
a300: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
a310: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
a320: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
a330: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
a340: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
a350: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
a360: 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e   " has no column
a370: 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d   named ", pList-
a380: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
a390: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
a3a0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
a3b0: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
a3c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
a3d0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
a3e0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
a3f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
a400: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
a410: 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
a420: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
a430: 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
a440: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
a450: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
a460: 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
a470: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
a480: 65 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65  explain && !hide
a490: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65  Name ){.    Inde
a4a0: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
a4b0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
a4c0: 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e  db->idxHash, pIn
a4d0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
a4e0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  en(zName)+1, pIn
a4f0: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
a500: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a510: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
a520: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
a530: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
a540: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
a550: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
a560: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
a570: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
a580: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
a590: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a5a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
a5b0: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
a5c0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
a5d0: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
a5e0: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
a5f0: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
a600: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
a610: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
a620: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
a630: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
a640: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
a650: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
a660: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
a670: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
a680: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
a690: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
a6a0: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
a6b0: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
a6c0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
a6d0: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
a6e0: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
a6f0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
a700: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
a710: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
a720: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
a730: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
a740: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
a750: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
a760: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
a770: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
a780: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
a790: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
a7a0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
a7b0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
a7c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
a7d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
a7e0: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
a7f0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
a800: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
a810: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
a820: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
a830: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
a840: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
a850: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
a860: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
a870: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
a880: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
a890: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
a8a0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
a8b0: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
a8c0: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
a8d0: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
a8e0: 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20  ag && pTable!=0 
a8f0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
a900: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
a910: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
a920: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
a930: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
a940: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
a950: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
a960: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
a970: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
a980: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a990: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
a9a0: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
a9b0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
a9c0: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
a9d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e    **.  ** The in
a9e0: 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e  itFlag is 0 when
a9f0: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
aa00: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
aa10: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
aa20: 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c  and.  The initFl
aa30: 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  ag is 1 when a d
aa40: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
aa50: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
aa60: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
aa70: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
aa80: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
aa90: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
aaa0: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
aab0: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
aac0: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
aad0: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
aae0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
aaf0: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
ab00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
ab10: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
ab20: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
ab30: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
ab40: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
ab50: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
ab60: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
ab70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
ab80: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
ab90: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
aba0: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
abb0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
abc0: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
abd0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
abe0: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
abf0: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
ac00: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
ac10: 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a  >initFlag==0 ){.
ac20: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
ac30: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
ac40: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
ac50: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
ac60: 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 54  ddr;.    int isT
ac70: 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  emp = pTab->isTe
ac80: 6d 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  mp;..    v = sql
ac90: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
aca0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
acb0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
acc0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
acd0: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
ace0: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
acf0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
ad00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
ad10: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ad30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
ad40: 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20  Write, 0, 2);.  
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ad60: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
ad70: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f  MASTER_NAME, P3_
ad80: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
ad90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
ada0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
adb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
adc0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
add0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
ade0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
adf0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
ae00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ae10: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
ae20: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
ae30: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
ae40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ae50: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
ae60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ae70: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
ae80: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
ae90: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
aea0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
aeb0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
aec0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
aed0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
aee0: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
aef0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
af00: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
af10: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
af20: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
af30: 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  dex, 0, isTemp);
af40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
af50: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
af60: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
af70: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
af80: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
af90: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
afa0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
afb0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
afc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
afd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
afe0: 65 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a  enWrAux, 1, 0);.
aff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b000: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b010: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
b020: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
b030: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b040: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
b050: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
b060: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
b070: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64  Temp ){.      ad
b080: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
b090: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
b0a0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
b0b0: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
b0c0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  nd ){.        n 
b0d0: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
b0e0: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
b0f0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73  ) + 1;.        s
b100: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b110: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
b120: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t->z, n);.      
b130: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
b140: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
b150: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
b160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b170: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
b180: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
b190: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
b1a0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
b1b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b1c0: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
b1d0: 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32  Aux : OP_Open, 2
b1e0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
b1f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
b200: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
b210: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
b220: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62  TATIC);.      lb
b230: 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l2 = sqliteVdbeM
b240: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b250: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b260: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b270: 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
b280: 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
b290: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
b2a0: 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cno, 2, 0);.    
b2b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
b2c0: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
b2d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
b2e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b2f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e  P_Column, 2, pIn
b300: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
b310: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b320: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b330: 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  (v, OP_MakeIdxKe
b340: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  y, pIndex->nColu
b350: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mn, 0);.      sq
b360: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b370: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
b380: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
b390: 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20  OE_None);.      
b3a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b3b0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
b3c0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
b3d0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
b3e0: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
b3f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b400: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b410: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
b420: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b430: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
b440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b450: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
b460: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
b470: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43  .        sqliteC
b480: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b  hangeCookie(db);
b490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b4a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b4b0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74  nteger, db->next
b4c0: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
b4d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b4e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
b4f0: 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  okie, 0, 0);.   
b500: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b510: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b520: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
b530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64  .      sqliteEnd
b540: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
b550: 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
b560: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
b570: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
b580: 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
b590: 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64  ndex:.  sqliteId
b5a0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
b5b0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
b5c0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
b5d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b5e0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
b5f0: 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
b600: 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
b610: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
b620: 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
b630: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
b640: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
b650: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
b660: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
b670: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
b680: 70 49 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a  pIndex;.  char *
b690: 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  zName;.  Vdbe *v
b6a0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
b6b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
b6c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
b6d0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
b6e0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
b6f0: 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  n;.  zName = sql
b700: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
b710: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
b720: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
b730: 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20  eturn;.  pIndex 
b740: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
b750: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  x(db, zName);.  
b760: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
b770: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
b780: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
b790: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
b7a0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
b7b0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20   such index: ", 
b7c0: 30 2c 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d  0, .        pNam
b7d0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
b7e0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
b7f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
b800: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rn;.  }..  /* Ge
b810: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
b820: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
b830: 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
b840: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
b850: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
b860: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
b870: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
b880: 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78  VdbeOp dropIndex
b890: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
b8a0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c  P_OpenWrite,  0,
b8b0: 20 32 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52   2,       MASTER
b8c0: 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20  _NAME},.      { 
b8d0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
b8e0: 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c 20 0a  , ADDR(10),0}, .
b8f0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
b900: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
b910: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
b920: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
b930: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
b940: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
b950: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
b960: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
b970: 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  4 */.      { OP_
b980: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31  Column,     0, 1
b990: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
b9a0: 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20    { OP_Eq,      
b9b0: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
b9c0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
b9d0: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
b9e0: 52 28 34 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(4), 0},.      
b9f0: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
ba00: 20 30 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c   0, ADDR(10),0},
ba10: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
ba20: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
ba30: 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a      0}, /* 9 */.
ba40: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
ba50: 65 72 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  er,    0, 0,    
ba60: 20 20 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a     0}, /* 10 */.
ba70: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
ba80: 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  okie,  0, 0,    
ba90: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
baa0: 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c  P_Close,      0,
bab0: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
bac0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73    };.    int bas
bad0: 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  e;.    Table *pT
bae0: 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
baf0: 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ble;..    sqlite
bb00: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
bb10: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
bb20: 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73 54 65   if( !pTab->isTe
bb30: 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73 65  mp ){.      base
bb40: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
bb50: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
bb60: 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20  ize(dropIndex), 
bb70: 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  dropIndex);.    
bb80: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
bb90: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20  geP3(v, base+2, 
bba0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50  pIndex->zName, P
bbb0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
bbc0: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
bbd0: 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73  kie(db);.      s
bbe0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
bbf0: 31 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64 62  1(v, base+10, db
bc00: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a  ->next_cookie);.
bc10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bc20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bc30: 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d  Destroy, pIndex-
bc40: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73 54  >tnum, pTab->isT
bc50: 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
bc60: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
bc70: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
bc80: 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 69 6e    /* Move the in
bc90: 64 65 78 20 6f 6e 74 6f 20 74 68 65 20 70 65 6e  dex onto the pen
bca0: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e  ding DROP queue.
bcb0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e 64    Or, if the ind
bcc0: 65 78 20 77 61 73 0a 20 20 2a 2a 20 6e 65 76 65  ex was.  ** neve
bcd0: 72 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73  r committed, jus
bce0: 74 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 6e  t delete it.  In
bcf0: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 70 65 6e  dices on the pen
bd00: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 0a  ding DROP queue.
bd10: 20 20 2a 2a 20 67 65 74 20 64 65 6c 65 74 65 64    ** get deleted
bd20: 20 62 79 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74   by sqliteCommit
bd30: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
bd40: 29 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  ) when the user 
bd50: 65 78 65 63 75 74 65 73 0a 20 20 2a 2a 20 61 20  executes.  ** a 
bd60: 43 4f 4d 4d 49 54 2e 20 20 4f 72 20 69 66 20 61  COMMIT.  Or if a
bd70: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
bd80: 2c 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  , the elements o
bd90: 66 20 74 68 65 20 44 52 4f 50 20 71 75 65 75 65  f the DROP queue
bda0: 0a 20 20 2a 2a 20 61 72 65 20 6d 6f 76 65 64 20  .  ** are moved 
bdb0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61  back into the ma
bdc0: 69 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  in hash table.. 
bdd0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
bde0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
bdf0: 20 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44    sqlitePendingD
be00: 72 6f 70 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  ropIndex(db, pIn
be10: 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  dex);.    db->fl
be20: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
be30: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
be40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
be50: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
be60: 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
be70: 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
be80: 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
be90: 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
bea0: 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
beb0: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
bec0: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
bed0: 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
bee0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
bef0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
bf00: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
bf10: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
bf20: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
bf30: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
bf40: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
bf50: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
bf60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
bf70: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64   if( (pList->nId
bf80: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
bf90: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
bfa0: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73  em *a;.    a = s
bfb0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
bfc0: 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e  st->a, (pList->n
bfd0: 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69  Id+8)*sizeof(pLi
bfe0: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
bff0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c000: 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44     sqliteIdListD
c010: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
c020: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c030: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
c040: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   = a;.  }.  mems
c050: 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
c060: 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a  st->nId], 0, siz
c070: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c080: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
c090: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
c0a0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
c0b0: 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a  st->nId].zName;.
c0c0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
c0d0: 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d  ring(pz, pToken-
c0e0: 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30  >z, pToken->n, 0
c0f0: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
c100: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
c110: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
c120: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
c130: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
c140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
c150: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
c160: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
c170: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
c180: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ist;.}../*.** Ad
c190: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
c1a0: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
c1b0: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
c1c0: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
c1d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64  */.void sqliteId
c1e0: 4c 69 73 74 41 64 64 41 6c 69 61 73 28 49 64 4c  ListAddAlias(IdL
c1f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
c200: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
c210: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
c220: 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20 20 69  ->nId>0 ){.    i
c230: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 49  nt i = pList->nI
c240: 64 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d - 1;.    sqlit
c250: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
c260: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
c270: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
c280: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73  en->n, 0);.    s
c290: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69  qliteDequote(pLi
c2a0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
c2b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
c2c0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
c2d0: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
c2e0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
c2f0: 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
c300: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
c310: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
c320: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
c330: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
c340: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
c350: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
c360: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
c370: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
c380: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ].zAlias);.    i
c390: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  f( pList->a[i].p
c3a0: 54 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  Tab && pList->a[
c3b0: 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  i].pTab->isTrans
c3c0: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
c3d0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
c3e0: 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  0, pList->a[i].p
c3f0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
c400: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
c410: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
c420: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 73  Select);.  }.  s
c430: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
c440: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
c450: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
c460: 2a 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d  ** The COPY comm
c470: 61 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70 61  and is for compa
c480: 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 50 6f  tibility with Po
c490: 73 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70 65  stgreSQL and spe
c4a0: 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f  cificially.** fo
c4b0: 72 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  r the ability to
c4c0: 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74   read the output
c4d0: 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54 68   of pg_dump.  Th
c4e0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a  e format is as.*
c4f0: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
c500: 20 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20 46      COPY table F
c510: 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47 20  ROM file [USING 
c520: 44 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69 6e  DELIMITERS strin
c530: 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22  g].**.** "table"
c540: 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
c550: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20  table name.  We 
c560: 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73 20  will read lines 
c570: 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20  of code from.** 
c580: 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68 69  file to fill thi
c590: 73 20 74 61 62 6c 65 20 77 69 74 68 20 64 61 74  s table with dat
c5a0: 61 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20 62  a.  File might b
c5b0: 65 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65 20  e "stdin".  The 
c5c0: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69  optional.** deli
c5d0: 6d 69 74 65 72 20 73 74 72 69 6e 67 20 69 64 65  miter string ide
c5e0: 6e 74 69 66 69 65 73 20 74 68 65 20 66 69 65 6c  ntifies the fiel
c5f0: 64 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 54  d separators.  T
c600: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 61 20  he default is a 
c610: 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tab..*/.void sql
c620: 69 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73 65  iteCopy(.  Parse
c630: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c640: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
c650: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
c660: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *pTableName,   
c670: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
c680: 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  he table into wh
c690: 69 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65  ich we will inse
c6a0: 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  rt */.  Token *p
c6b0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
c6c0: 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68  The file from wh
c6d0: 69 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e  ich to obtain in
c6e0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  formation */.  T
c6f0: 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72  oken *pDelimiter
c700: 2c 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20  ,   /* Use this 
c710: 61 73 20 74 68 65 20 66 69 65 6c 64 20 64 65 6c  as the field del
c720: 69 6d 69 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  imiter */.  int 
c730: 6f 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20 20  onError         
c740: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 69   /* What to do i
c750: 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  f a constraint f
c760: 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ails */.){.  Tab
c770: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72  le *pTab;.  char
c780: 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *zTab;.  int i;
c790: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
c7a0: 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49  t addr, end;.  I
c7b0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 73 71  ndex *pIdx;.  sq
c7c0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
c7d0: 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62 20 3d  e->db;..  zTab =
c7e0: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
c7f0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
c800: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
c810: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
c820: 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 67  d || zTab==0 ) g
c830: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
c840: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
c850: 65 54 61 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c  eTableNameToTabl
c860: 65 28 70 50 61 72 73 65 2c 20 7a 54 61 62 29 3b  e(pParse, zTab);
c870: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
c880: 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ab);.  if( pTab=
c890: 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63  =0 ) goto copy_c
c8a0: 6c 65 61 6e 75 70 3b 0a 20 20 76 20 3d 20 73 71  leanup;.  v = sq
c8b0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
c8c0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
c8d0: 20 20 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a      int openOp;.
c8e0: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 4d      sqliteBeginM
c8f0: 75 6c 74 69 57 72 69 74 65 4f 70 65 72 61 74 69  ultiWriteOperati
c900: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
c910: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
c920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
c930: 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eOpen, 0, 0);.  
c940: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
c950: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46  geP3(v, addr, pF
c960: 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c  ilename->z, pFil
c970: 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  ename->n);.    s
c980: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
c990: 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  P3(v, addr);.   
c9a0: 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e   openOp = pTab->
c9b0: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
c9c0: 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57  WrAux : OP_OpenW
c9d0: 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  rite;.    sqlite
c9e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
c9f0: 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e  nOp, 0, pTab->tn
ca00: 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  um);.    sqliteV
ca10: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
ca20: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
ca30: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ca40: 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54  for(i=1, pIdx=pT
ca50: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
ca60: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ca70: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
ca80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ca90: 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70 49  v, openOp, i, pI
caa0: 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20  dx->tnum);.     
cab0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
cac0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d  eP3(v, -1, pIdx-
cad0: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
cae0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  C);.    }.    if
caf0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
cb00: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
cb10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
cb20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
cb30: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20 2f  teger, 0, 0);  /
cb40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
cb50: 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   row count */.  
cb60: 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71    }.    end = sq
cb70: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
cb80: 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  l(v);.    addr =
cb90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
cba0: 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c  (v, OP_FileRead,
cbb0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64   pTab->nCol, end
cbc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c 69  );.    if( pDeli
cbd0: 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  miter ){.      s
cbe0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
cbf0: 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c 69  3(v, addr, pDeli
cc00: 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d  miter->z, pDelim
cc10: 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  iter->n);.      
cc20: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
cc30: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
cc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
cc50: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
cc60: 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c  3(v, addr, "\t",
cc70: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
cc80: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
cc90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
cca0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ccb0: 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54 61  _FileColumn, pTa
ccc0: 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20 20  b->iPKey, 0);.  
ccd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cce0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  dOp(v, OP_MustBe
ccf0: 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Int, 0, 0);.    
cd00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
cd10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cd20: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
cd30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
cd40: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
cd50: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cd60: 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50   if( i==pTab->iP
cd70: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Key ){.        /
cd80: 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 70 72  * The integer pr
cd90: 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e  imary key column
cda0: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
cdb0: 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a 20  NULL since its. 
cdc0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
cdd0: 69 73 20 61 6c 77 61 79 73 20 70 75 6c 6c 65 64  is always pulled
cde0: 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
cdf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
ce00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ce10: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
ce20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
ce30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
ce40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ce50: 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69  OP_FileColumn, i
ce60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ce70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 47 65    }.    sqliteGe
ce80: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
ce90: 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70  Checks(pParse, p
cea0: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  Tab, 0, 0, 0, 0,
ceb0: 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b   onError, addr);
cec0: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c  .    sqliteCompl
ced0: 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61  eteInsertion(pPa
cee0: 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c  rse, pTab, 0, 0,
cef0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
cf00: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
cf10: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d  ITE_CountRows)!=
cf20: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
cf30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cf40: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 20  _AddImm, 1, 0); 
cf50: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f   /* Increment ro
cf60: 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d  w count */.    }
cf70: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
cf80: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
cf90: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73   0, addr);.    s
cfa0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
cfb0: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20  Label(v, end);. 
cfc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cfd0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
cfe0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cff0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
d000: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  n(pParse);.    i
d010: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
d020: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
d030: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
d040: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d050: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
d060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
d070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d080: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29  olumnName, 0, 0)
d090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d0a0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
d0b0: 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64  , "rows inserted
d0c0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
d0d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d0e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
d0f0: 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ack, 1, 0);.    
d100: 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c  }.  }.  .copy_cl
d110: 65 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b  eanup:.  return;
d120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f  .}../*.** The no
d130: 6e 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55 55  n-standard VACUU
d140: 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  M command is use
d150: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  d to clean up th
d160: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63  e database,.** c
d170: 6f 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70 61  ollapse free spa
d180: 63 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20  ce, etc.  It is 
d190: 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74  modelled after t
d1a0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
d1b0: 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53  d.** in PostgreS
d1c0: 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72  QL..**.** In ver
d1d0: 73 69 6f 6e 20 31 2e 30 2e 78 20 6f 66 20 53 51  sion 1.0.x of SQ
d1e0: 4c 69 74 65 2c 20 74 68 65 20 56 41 43 55 55 4d  Lite, the VACUUM
d1f0: 20 63 6f 6d 6d 61 6e 64 20 77 6f 75 6c 64 20 63   command would c
d200: 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f 72 65 6f 72  all.** gdbm_reor
d210: 67 61 6e 69 7a 65 28 29 20 6f 6e 20 61 6c 6c 20  ganize() on all 
d220: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
d230: 6c 65 73 2e 20 20 42 75 74 20 62 65 67 69 6e 6e  les.  But beginn
d240: 69 6e 67 0a 2a 2a 20 77 69 74 68 20 32 2e 30 2e  ing.** with 2.0.
d250: 30 2c 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  0, SQLite no lon
d260: 67 65 72 20 75 73 65 73 20 47 44 42 4d 20 73 6f  ger uses GDBM so
d270: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 68 61   this command ha
d280: 73 0a 2a 2a 20 62 65 63 6f 6d 65 20 61 20 6e 6f  s.** become a no
d290: 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  -op..*/.void sql
d2a0: 69 74 65 56 61 63 75 75 6d 28 50 61 72 73 65 20  iteVacuum(Parse 
d2b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
d2c0: 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 2f  pTableName){.  /
d2d0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
d2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
d2f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
d300: 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e  void sqliteBegin
d310: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
d320: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
d330: 6e 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74  nError){.  sqlit
d340: 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e *db;..  if( pP
d350: 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
d360: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
d370: 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65   db->pBe==0 ) re
d380: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
d390: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d3a0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
d3b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
d3c0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
d3d0: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 20 72 65  ITE_InTrans ) re
d3e0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 42 65  turn;.  sqliteBe
d3f0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
d400: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d  n(pParse);.  db-
d410: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
d420: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e  _InTrans;.  db->
d430: 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
d440: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  r;.}../*.** Comm
d450: 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
d460: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
d470: 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
d480: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
d490: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
d4a0: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
d4b0: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
d4c0: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
d4d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d4e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
d4f0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
d500: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
d510: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
d520: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
d530: 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72  rans)==0 ) retur
d540: 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  n;.  db->flags &
d550: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
d560: 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72  s;.  sqliteEndWr
d570: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d580: 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rse);.  db->onEr
d590: 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  ror = OE_Default
d5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
d5b0: 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
d5c0: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
d5d0: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
d5e0: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d5f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
d600: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
d610: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
d620: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
d630: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
d640: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
d650: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
d660: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
d670: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
d680: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
d690: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
d6a0: 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ns)==0 ) return;
d6b0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
d6c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d6d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
d6e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d6f0: 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20  OP_Rollback, 0, 
d700: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  0);.  }.  db->fl
d710: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
d720: 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e  nTrans;.  db->on
d730: 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75  Error = OE_Defau
d740: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  lt;.}../*.** Gen
d750: 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
d760: 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
d770: 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
d780: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
d790: 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
d7a0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 70 65  tabase.  The ope
d7b0: 72 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ration will be a
d7c0: 74 6f 6d 69 63 20 69 6e 20 74 68 65 0a 2a 2a 20  tomic in the.** 
d7d0: 73 65 6e 73 65 20 74 68 61 74 20 69 74 20 77 69  sense that it wi
d7e0: 6c 6c 20 65 69 74 68 65 72 20 64 6f 20 69 74 73  ll either do its
d7f0: 20 63 68 61 6e 67 65 73 20 63 6f 6d 70 6c 65 74   changes complet
d800: 65 6c 79 20 6f 72 20 6e 6f 74 20 61 74 0a 2a 2a  ely or not at.**
d810: 20 61 6c 6c 2e 20 20 53 6f 20 74 68 65 72 65 20   all.  So there 
d820: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
d830: 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  t a checkpoint i
d840: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  s a transaction.
d850: 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
d860: 20 65 66 66 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   effect..*/.void
d870: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
d880: 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
d890: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
d8a0: 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69  e *v;.  v = sqli
d8b0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
d8c0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
d8d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
d8e0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
d8f0: 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20  ) return; /* if 
d900: 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69  this is in a tri
d910: 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70  gger */.  if( (p
d920: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
d930: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
d940: 73 29 3d 3d 30 20 20 29 7b 0a 20 20 20 20 73 71  s)==0  ){.    sq
d950: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d960: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
d970: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
d980: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d990: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
d9a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65  pParse->db->sche
d9b0: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  ma_cookie, 0);. 
d9c0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
d9d0: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
d9e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
d9f0: 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
da00: 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
da10: 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
da20: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
da30: 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
da40: 61 62 61 73 65 2e 20 20 54 68 65 20 6f 70 65 72  abase.  The oper
da50: 61 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20  ation might not 
da60: 62 65 20 61 74 6f 6d 69 63 20 69 6e 0a 2a 2a 20  be atomic in.** 
da70: 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 61  the sense that a
da80: 6e 20 65 72 72 6f 72 20 6d 61 79 20 62 65 20 64  n error may be d
da90: 69 73 63 6f 76 65 72 65 64 20 61 6e 64 20 74 68  iscovered and th
daa0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69 67 68  e operation migh
dab0: 74 0a 2a 2a 20 61 62 6f 72 74 20 61 66 74 65 72  t.** abort after
dac0: 20 73 6f 6d 65 20 63 68 61 6e 67 65 73 20 68 61   some changes ha
dad0: 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 20 49  ve been made.  I
dae0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
daf0: 6d 69 64 64 6c 65 20 0a 2a 2a 20 6f 66 20 61 20  middle .** of a 
db00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
db10: 6e 20 74 68 69 73 20 73 65 74 73 20 61 20 63 68  n this sets a ch
db20: 65 63 6b 70 6f 69 6e 74 2e 20 20 49 66 20 77 65  eckpoint.  If we
db30: 20 61 72 65 20 6e 6f 74 20 69 6e 0a 2a 2a 20 61   are not in.** a
db40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
db50: 65 6e 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  en start a trans
db60: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  action..*/.void 
db70: 73 71 6c 69 74 65 42 65 67 69 6e 4d 75 6c 74 69  sqliteBeginMulti
db80: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
db90: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
dba0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20   Vdbe *v;.  v = 
dbb0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
dbc0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
dbd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
dbe0: 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  ( pParse->trigSt
dbf0: 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ack ) return; /*
dc00: 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61   if this is in a
dc10: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66   trigger */.  if
dc20: 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
dc30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
dc40: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
dc50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
dc60: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
dc70: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  on, 0, 0);.    s
dc80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dc90: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
dca0: 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73  e, pParse->db->s
dcb0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29  chema_cookie, 0)
dcc0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63  ;.    pParse->sc
dcd0: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
dce0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
dcf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dd00: 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c  , OP_Checkpoint,
dd10: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
dd20: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
dd30: 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65  de that conclude
dd40: 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  s an operation t
dd50: 68 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61  hat may have cha
dd60: 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61  nged.** the data
dd70: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 61  base.  This is a
dd80: 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63 74   companion funct
dd90: 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72 69 74  ion to BeginWrit
dda0: 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a 2a 2a  eOperation()..**
ddb0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
ddc0: 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74  n was started, t
ddd0: 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e 20 20  hen commit it.  
dde0: 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  If a checkpoint 
ddf0: 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64 20 74  was.** started t
de00: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61 74 2e  hen commit that.
de10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
de20: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
de30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
de40: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66  .  Vdbe *v;.  if
de50: 20 28 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   (pParse->trigSt
de60: 61 63 6b 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  ack) return; /* 
de70: 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20  if this is in a 
de80: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d  trigger */.  v =
de90: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
dea0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
deb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
dec0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
ded0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
dee0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Trans ){.    /* 
def0: 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do Nothing */.  
df00: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
df10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
df20: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
df30: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e    }.}.../*.** In
df40: 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76 65  terpret the give
df50: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 62 6f  n string as a bo
df60: 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
df70: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 42 6f  static int getBo
df80: 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  olean(char *z){.
df90: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
dfa0: 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73  zTrue[] = { "yes
dfb0: 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20  ", "on", "true" 
dfc0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  };.  int i;.  if
dfd0: 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  ( z[0]==0 ) retu
dfe0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69  rn 0;.  if( isdi
dff0: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b  git(z[0]) || (z[
e000: 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67  0]=='-' && isdig
e010: 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20  it(z[1])) ){.   
e020: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b   return atoi(z);
e030: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
e040: 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29  i<sizeof(azTrue)
e050: 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30  /sizeof(azTrue[0
e060: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
e070: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
e080: 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20  z,azTrue[i])==0 
e090: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
e0a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
e0b0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
e0c0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
e0d0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
e0e0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
e0f0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
e100: 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a  AGMA id = value.
e110: 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69  **.** The identi
e120: 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  fier might also 
e130: 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68  be a string.  Th
e140: 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
e150: 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e  ing, and.** iden
e160: 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d  tifier, or a num
e170: 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c  ber.  If minusFl
e180: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
e190: 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   the value is.**
e1a0: 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77   a number that w
e1b0: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
e1c0: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a   minus sign..*/.
e1d0: 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d  void sqlitePragm
e1e0: 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
e1f0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
e200: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e  oken *pRight, in
e210: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
e220: 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
e230: 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20  .  char *zRight 
e240: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  = 0;.  sqlite *d
e250: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e260: 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74  .  zLeft = sqlit
e270: 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e  eStrNDup(pLeft->
e280: 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20  z, pLeft->n);.  
e290: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
e2a0: 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75  eft);.  if( minu
e2b0: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69  sFlag ){.    zRi
e2c0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ght = 0;.    sql
e2d0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
e2e0: 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70  Right, "-", 1, p
e2f0: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
e300: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
e310: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
e320: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69  qliteStrNDup(pRi
e330: 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
e340: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  n);.    sqliteDe
e350: 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20  quote(zRight);. 
e360: 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20   }. .  /*.  **  
e370: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63  PRAGMA default_c
e380: 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20  ache_size.  **  
e390: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63  PRAGMA default_c
e3a0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
e3b0: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
e3c0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
e3d0: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
e3e0: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
e3f0: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
e400: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
e410: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
e420: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
e430: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
e440: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
e450: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
e460: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
e470: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
e480: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
e490: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
e4a0: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
e4b0: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
e4c0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
e4d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e4e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
e4f0: 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69  default cache si
e500: 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ze is stored in 
e510: 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f 66 20  meta-value 2 of 
e520: 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a 20 20  page 1 of the.  
e530: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
e540: 2e 20 20 54 68 65 20 63 61 63 68 65 20 73 69 7a  .  The cache siz
e550: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68  e is actually th
e560: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
e570: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65   of.  ** this me
e580: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20  mory location.  
e590: 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65 74 61  The sign of meta
e5a0: 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72 6d 69  -value 2 determi
e5b0: 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 79 6e  nes the.  ** syn
e5c0: 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67  chronous setting
e5d0: 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 76 61  .  A negative va
e5e0: 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72  lue means synchr
e5f0: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20 20 2a  onous is off.  *
e600: 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69 76 65  * and a positive
e610: 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e   value means syn
e620: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a  chronous is on..
e630: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
e640: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
e650: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
e660: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ze")==0 ){.    s
e670: 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
e680: 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a  CacheSize[] = {.
e690: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
e6a0: 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20  ookie,  0, 2,   
e6b0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
e6c0: 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 20 20   OP_AbsValue,   
e6d0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
e6e0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70  ,.      { OP_Dup
e6f0: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  ,         0, 0, 
e700: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
e710: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
e720: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
e730: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
e740: 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 36  e,          0, 6
e750: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
e760: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
e770: 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53 2c 30       MAX_PAGES,0
e780: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
e790: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
e7a0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
e7b0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
e7c0: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
e7d0: 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22      "cache_size"
e7e0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
e7f0: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
e800: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
e810: 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
e820: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
e830: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
e840: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e850: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
e860: 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
e870: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e880: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
e890: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
e8a0: 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65  e), getCacheSize
e8b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e8c0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
e8d0: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61      int size = a
e8e0: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
e8f0: 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20     if( size<0 ) 
e900: 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
e910: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
e920: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
e930: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
e940: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e950: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65  OP_Integer, size
e960: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e970: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e980: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c  P_ReadCookie, 0,
e990: 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   2);.      addr 
e9a0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
e9b0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
e9c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e9d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e9e0: 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b   OP_Ge, 0, addr+
e9f0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
ea00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ea10: 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
ea20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ea30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
ea40: 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
ea50: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
ea60: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ea70: 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
ea80: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62 2d  cache_size = db-
ea90: 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f 20  >cache_size<0 ? 
eaa0: 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20 20  -size : size;.  
eab0: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
eac0: 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
ead0: 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
eae0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
eaf0: 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
eb00: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
eb10: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  e.  **  PRAGMA c
eb20: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
eb30: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
eb40: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
eb50: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
eb60: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
eb70: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
eb80: 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c 20  ize.  The local 
eb90: 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65 20 64  setting can be d
eba0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20 20  ifferent from.  
ebb0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
ebc0: 74 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  t cache size val
ebd0: 75 65 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ue that is store
ebe0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
ebf0: 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 73 65  e.  ** file itse
ec00: 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  lf.  The value r
ec10: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
ec20: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
ec30: 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
ec40: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
ec50: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
ec60: 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20  sets the local. 
ec70: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
ec80: 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74 20 64  ize value.  It d
ec90: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
eca0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 20 20  he persistent.  
ecb0: 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20 73 74  ** cache size st
ecc0: 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69 73 6b  ored on the disk
ecd0: 20 73 6f 20 74 68 65 20 63 61 63 68 65 20 73 69   so the cache si
ece0: 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74 0a 20  ze will revert. 
ecf0: 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66 61 75   ** to its defau
ed00: 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  lt value when th
ed10: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
ed20: 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65 6e 65  osed and reopene
ed30: 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c 64  d..  ** N should
ed40: 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 69   be a positive i
ed50: 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  nteger..  */.  i
ed60: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
ed70: 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69  (zLeft,"cache_si
ed80: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ze")==0 ){.    s
ed90: 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
eda0: 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a  CacheSize[] = {.
edb0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
edc0: 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
edd0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ede0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
edf0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
ee00: 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
ee10: 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
ee20: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
ee30: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
ee40: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ee50: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
ee60: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ee70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
ee80: 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
ee90: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e  t->z ){.      in
eea0: 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63  t size = db->cac
eeb0: 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20 20  he_size;;.      
eec0: 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
eed0: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
eee0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
eef0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ef00: 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  size, 0);.      
ef10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
ef20: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
ef30: 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20  (getCacheSize), 
ef40: 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20  getCacheSize);. 
ef50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef60: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
ef70: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
ef80: 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
ef90: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
efa0: 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  if( db->cache_si
efb0: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
efc0: 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  ize;.      db->c
efd0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
efe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
eff0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
f000: 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63  db->pBe, db->cac
f010: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
f020: 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
f030: 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
f040: 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  lt_synchronous. 
f050: 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
f060: 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ult_synchronous=
f070: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
f080: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
f090: 20 72 65 74 75 72 6e 73 20 74 68 65 20 70 65 72   returns the per
f0a0: 73 69 73 74 65 6e 74 20 76 61 6c 75 65 20 6f 66  sistent value of
f0b0: 20 74 68 65 20 22 73 79 6e 63 68 72 6f 6e 6f 75   the "synchronou
f0c0: 73 22 20 73 65 74 74 69 6e 67 0a 20 20 2a 2a 20  s" setting.  ** 
f0d0: 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
f0e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
f0f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 73 79 6e   This is the syn
f100: 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67  chronous setting
f110: 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 20 75 73   that.  ** is us
f120: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
f130: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
f140: 65 64 20 75 6e 6c 65 73 73 20 6f 76 65 72 72 69  ed unless overri
f150: 64 64 65 6e 20 62 79 20 61 20 73 65 70 61 72 61  dden by a separa
f160: 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63 68 72 6f  te.  ** "synchro
f170: 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e 20 20 54  nous" pragma.  T
f180: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63  he second form c
f190: 68 61 6e 67 65 73 20 74 68 65 20 70 65 72 73 69  hanges the persi
f1a0: 73 74 65 6e 74 20 61 6e 64 20 74 68 65 0a 20 20  stent and the.  
f1b0: 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63 68 72 6f  ** local synchro
f1c0: 6e 6f 75 73 20 73 65 74 74 69 6e 67 20 74 6f 20  nous setting to 
f1d0: 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e 2e  the value given.
f1e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 73 79  .  **.  ** If sy
f1f0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2c  nchronous is on,
f200: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 64 6f 20   SQLite will do 
f210: 61 6e 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  an fsync() syste
f220: 6d 20 63 61 6c 6c 20 61 74 20 73 74 72 61 74 65  m call at strate
f230: 67 69 63 0a 20 20 2a 2a 20 70 6f 69 6e 74 73 20  gic.  ** points 
f240: 74 6f 20 69 6e 73 75 72 65 20 74 68 61 74 20 61  to insure that a
f250: 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79 20 77 72  ll previously wr
f260: 69 74 74 65 6e 20 64 61 74 61 20 68 61 73 20 61  itten data has a
f270: 63 74 75 61 6c 6c 79 20 62 65 65 6e 0a 20 20 2a  ctually been.  *
f280: 2a 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  * written onto t
f290: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
f2a0: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
f2b0: 67 2e 20 20 54 68 69 73 20 6d 6f 64 65 20 69 6e  g.  This mode in
f2c0: 73 75 72 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sures that.  ** 
f2d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
f2e0: 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 20 61  l always be in a
f2f0: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
f300: 65 20 65 76 65 6e 74 20 69 66 20 74 68 65 20 6f  e event if the o
f310: 70 65 72 61 74 69 6e 67 0a 20 20 2a 2a 20 73 79  perating.  ** sy
f320: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
f330: 70 6f 77 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  power to the com
f340: 70 75 74 65 72 20 69 73 20 69 6e 74 65 72 72 75  puter is interru
f350: 70 74 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c  pted unexpectedl
f360: 79 2e 0a 20 20 2a 2a 20 57 68 65 6e 20 73 79 6e  y..  ** When syn
f370: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
f380: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
f390: 20 77 61 69 74 20 66 6f 72 20 63 68 61 6e 67 65   wait for change
f3a0: 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 0a 20 20  s to actually.  
f3b0: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
f3c0: 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
f3d0: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 41 73   continuing.  As
f3e0: 20 73 6f 6f 6e 20 61 73 20 69 74 20 68 61 6e 64   soon as it hand
f3f0: 73 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  s changes.  ** t
f400: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  o the operating 
f410: 73 79 73 74 65 6d 2c 20 69 74 20 61 73 73 75 6d  system, it assum
f420: 65 73 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  es that the chan
f430: 67 65 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e  ges are permanen
f440: 74 20 61 6e 64 0a 20 20 2a 2a 20 69 74 20 63 6f  t and.  ** it co
f450: 6e 74 69 6e 75 65 73 20 67 6f 69 6e 67 2e 20 20  ntinues going.  
f460: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  The database can
f470: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
f480: 20 62 79 20 61 20 70 72 6f 67 72 61 6d 20 63 72   by a program cr
f490: 61 73 68 0a 20 20 2a 2a 20 65 76 65 6e 20 77 69  ash.  ** even wi
f4a0: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f  th synchronous o
f4b0: 66 66 2c 20 62 75 74 20 61 6e 20 6f 70 65 72 61  ff, but an opera
f4c0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
f4d0: 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 0a  h or power loss.
f4e0: 20 20 2a 2a 20 63 6f 75 6c 64 20 70 6f 74 65 6e    ** could poten
f4f0: 74 69 61 6c 6c 79 20 63 6f 72 72 75 70 74 20 64  tially corrupt d
f500: 61 74 61 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ata.  On the oth
f510: 65 72 20 68 61 6e 64 2c 20 73 79 6e 63 68 72 6f  er hand, synchro
f520: 6e 6f 75 73 20 6f 66 66 20 69 73 0a 20 20 2a 2a  nous off is.  **
f530: 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79 6e   faster than syn
f540: 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e 0a 20 20 2a  chronous on..  *
f550: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
f560: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66  rICmp(zLeft,"def
f570: 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73  ault_synchronous
f580: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
f590: 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 53 79  tic VdbeOp getSy
f5a0: 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  nc[] = {.      {
f5b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
f5c0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
f5d0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  ,.      { OP_Rea
f5e0: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
f5f0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
f600: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
f610: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
f620: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c  0},.      { OP_L
f630: 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 35  t,          0, 5
f640: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f650: 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20     { OP_AddImm, 
f660: 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20       1, 0,      
f670: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
f680: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
f690: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
f6a0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
f6b0: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
f6c0: 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
f6d0: 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
f6e0: 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
f6f0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f700: 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
f710: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
f720: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f730: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
f740: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
f750: 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
f760: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f770: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f780: 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20  ySize(getSync), 
f790: 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65  getSync);.    }e
f7a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  lse{.      int a
f7b0: 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  ddr;.      int s
f7c0: 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f  ize = db->cache_
f7d0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
f7e0: 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20  size<0 ) size = 
f7f0: 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  -size;.      sql
f800: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
f810: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
f820: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f830: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
f840: 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
f850: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f860: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
f870: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 0);.      add
f880: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
f890: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
f8a0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
f8b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f8c0: 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 61 64 64  v, OP_Ne, 0, add
f8d0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
f8e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f8f0: 50 5f 41 64 64 49 6d 6d 2c 20 4d 41 58 5f 50 41  P_AddImm, MAX_PA
f900: 47 45 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  GES, 0);.      s
f910: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f920: 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 30  , OP_AbsValue, 0
f930: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
f940: 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67  !getBoolean(zRig
f950: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ht) ){.        s
f960: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f970: 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30  , OP_Negative, 0
f980: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 69  , 0);.        si
f990: 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
f9a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f9b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f9c0: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29  SetCookie, 0, 2)
f9d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e  ;.      sqliteEn
f9e0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
f9f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64  pParse);.      d
fa00: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
fa10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
fa20: 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53  teBtreeSetCacheS
fa30: 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d  ize(db->pBe, db-
fa40: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
fa50: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
fa60: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
fa70: 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a  synchronous.  **
fa80: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
fa90: 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20  onous=BOOLEAN.  
faa0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
fab0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
fac0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e  value of the syn
fad0: 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20  chronous flag.  
fae0: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
faf0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
fb00: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
fb10: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
fb20: 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a  file and the.  *
fb30: 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * default value 
fb40: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
fb50: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
fb60: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20  he database is. 
fb70: 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f   ** opened..  */
fb80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
fb90: 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63  ICmp(zLeft,"sync
fba0: 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a  hronous")==0 ){.
fbb0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
fbc0: 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a  p getSync[] = {.
fbd0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
fbe0: 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
fbf0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
fc00: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
fc10: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 73   0, 0,        "s
fc20: 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20  ynchronous"},.  
fc30: 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
fc40: 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
fc50: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
fc60: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
fc70: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
fc80: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
fc90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
fca0: 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65  ( pRight->z==pLe
fcb0: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73  ft->z ){.      s
fcc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fcd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
fce0: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3e 3d 30 2c  ->cache_size>=0,
fcf0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
fd00: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
fd10: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53  , ArraySize(getS
fd20: 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a  ync), getSync);.
fd30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd40: 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e   int size = db->
fd50: 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20  cache_size;.    
fd60: 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
fd70: 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
fd80: 20 20 20 69 66 28 20 21 67 65 74 42 6f 6f 6c 65     if( !getBoole
fd90: 61 6e 28 7a 52 69 67 68 74 29 20 29 20 73 69 7a  an(zRight) ) siz
fda0: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
fdb0: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
fdc0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
fdd0: 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
fde0: 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64  eSize(db->pBe, d
fdf0: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
fe00: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
fe10: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
fe20: 6d 70 28 7a 4c 65 66 74 2c 20 22 74 72 69 67 67  mp(zLeft, "trigg
fe30: 65 72 5f 6f 76 65 72 68 65 61 64 5f 74 65 73 74  er_overhead_test
fe40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
fe50: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
fe60: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 61 6c 77  ht) ){.      alw
fe70: 61 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72  ays_code_trigger
fe80: 5f 73 65 74 75 70 20 3d 20 31 3b 0a 20 20 20 20  _setup = 1;.    
fe90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 6c 77  }else{.      alw
fea0: 61 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72  ays_code_trigger
feb0: 5f 73 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  _setup = 0;.    
fec0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
fed0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
fee0: 4c 65 66 74 2c 20 22 76 64 62 65 5f 74 72 61 63  Left, "vdbe_trac
fef0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  e")==0 ){.    if
ff00: 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
ff10: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
ff20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ff30: 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20  E_VdbeTrace;.   
ff40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
ff50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ff60: 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20  TE_VdbeTrace;.  
ff70: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
ff80: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
ff90: 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c 5f 63 6f  (zLeft, "full_co
ffa0: 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30 20  lumn_names")==0 
ffb0: 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
ffc0: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
ffd0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
ffe0: 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43   |= SQLITE_FullC
fff0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 65 6c  olNames;.    }el
10000 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
10010 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46  ags &= ~SQLITE_F
10020 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20  ullColNames;.   
10030 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
10040 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
10050 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73  zLeft, "result_s
10060 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20  et_details")==0 
10070 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
10080 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
10090 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
100a0 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c   |= SQLITE_Resul
100b0 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65  tDetails;.    }e
100c0 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
100d0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
100e0 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20  ResultDetails;. 
100f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
10100 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
10110 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f  p(zLeft, "count_
10120 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a  changes")==0 ){.
10130 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
10140 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
10150 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
10160 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
10170 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
10180 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
10190 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f   ~SQLITE_CountRo
101a0 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ws;.    }.  }els
101b0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
101c0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65  trICmp(zLeft, "e
101d0 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c  mpty_result_call
101e0 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20  backs")==0 ){.  
101f0 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
10200 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
10210 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
10220 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
10230 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
10240 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
10250 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61  = ~SQLITE_NullCa
10260 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  llback;.    }.  
10270 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
10280 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
10290 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d  , "table_info")=
102a0 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
102b0 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
102c0 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
102d0 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
102e0 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
102f0 69 66 28 20 70 54 61 62 20 29 20 76 20 3d 20 73  if( pTab ) v = s
10300 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10310 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rse);.    if( pT
10320 61 62 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  ab && v ){.     
10330 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
10340 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
10350 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
10360 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
10370 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  5, 0,       0},.
10380 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10390 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
103a0 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
103b0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
103c0 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
103d0 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
103e0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
103f0 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
10400 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20     "type"},.    
10410 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
10420 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20  ame,  3, 0,     
10430 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20    "notnull"},.  
10440 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10450 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20  nName,  4, 0,   
10460 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22      "dflt_value"
10470 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
10480 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
10490 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
104a0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
104b0 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
104c0 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ), tableInfoPref
104d0 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
104e0 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
104f0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
10500 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
10510 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
10520 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
10530 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10540 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
10550 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10560 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10570 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
10580 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10590 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
105a0 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
105b0 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ].zName, P3_STAT
105c0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
105d0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
105e0 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
105f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10600 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10610 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
10620 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  pTab->aCol[i].zT
10630 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  ype ? pTab->aCol
10640 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78  [i].zType : "tex
10650 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  t", P3_STATIC);.
10660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10670 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10680 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f  teger, pTab->aCo
10690 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29  l[i].notNull, 0)
106a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
106b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
106c0 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
106d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
106e0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
106f0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
10700 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29  Dflt, P3_STATIC)
10710 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10720 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10730 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b  Callback, 5, 0);
10740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10750 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
10760 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
10770 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29  t, "index_info")
10780 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
10790 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
107a0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62  e *pTab;.    Vdb
107b0 65 20 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d  e *v;.    pIdx =
107c0 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
107d0 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  (db, zRight);.  
107e0 20 20 69 66 28 20 70 49 64 78 20 29 20 76 20 3d    if( pIdx ) v =
107f0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
10800 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
10810 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20  pIdx && v ){.   
10820 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
10830 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
10840 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
10850 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
10860 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 3, 0,       0}
10870 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
10880 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
10890 2c 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d  ,       "seqno"}
108a0 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
108b0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30  olumnName,  1, 0
108c0 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a  ,       "cid"},.
108d0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
108e0 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
108f0 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
10900 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
10910 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20  t i;.      pTab 
10920 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
10930 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10940 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
10950 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f  aySize(tableInfo
10960 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49  Preface), tableI
10970 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20  nfoPreface);.   
10980 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
10990 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
109a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
109b0 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  num = pIdx->aiCo
109c0 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
109d0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
109e0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
109f0 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
10a00 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10a10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e  , OP_Integer, cn
10a20 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
10a30 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10a40 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
10a50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
10a60 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
10a70 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cnum );.        
10a80 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
10a90 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
10aa0 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65  aCol[cnum].zName
10ab0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10ac0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10ad0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
10ae0 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20  back, 3, 0);.   
10af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
10b00 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
10b10 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
10b20 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20  index_list")==0 
10b30 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
10b40 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
10b50 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
10b60 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
10b70 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
10b80 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
10b90 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
10ba0 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10bb0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
10bc0 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49   pIdx = pTab->pI
10bd0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
10be0 69 66 28 20 70 54 61 62 20 26 26 20 70 49 64 78  if( pTab && pIdx
10bf0 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 69   && v ){.      i
10c00 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
10c10 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69   static VdbeOp i
10c20 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b  ndexListPreface[
10c30 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
10c40 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
10c50 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
10c60 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10c70 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
10c80 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20        "seq"},.  
10c90 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10ca0 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
10cb0 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
10cc0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
10cd0 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
10ce0 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20     "unique"},.  
10cf0 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71      };..      sq
10d00 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
10d10 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69  t(v, ArraySize(i
10d20 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
10d30 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  , indexListPrefa
10d40 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ce);.      while
10d50 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20  (pIdx){.        
10d60 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10d70 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
10d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
10d90 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10da0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
10db0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10dc0 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
10dd0 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
10de0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10df0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10e00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
10e10 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ger, pIdx->onErr
10e20 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b  or!=OE_None, 0);
10e30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10e40 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10e50 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
10e60 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20          ++i;.   
10e70 20 20 20 20 20 70 49 64 78 20 3d 20 70 49 64 78       pIdx = pIdx
10e80 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
10e90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
10ea0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
10eb0 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10ec0 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65  mp(zLeft, "parse
10ed0 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a  r_trace")==0 ){.
10ee0 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
10ef0 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
10f00 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29  e(FILE*, char *)
10f10 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  ;.    if( getBoo
10f20 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
10f30 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73        sqlitePars
10f40 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20  erTrace(stdout, 
10f50 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20  "parser: ");.   
10f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
10f70 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
10f80 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
10f90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
10fa0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
10fb0 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69  (zLeft, "integri
10fc0 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b  ty_check")==0 ){
10fd0 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
10fe0 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b  Op checkDb[] = {
10ff0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
11000 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20  nsert,   0, 0,  
11010 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20        "2"},.    
11020 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20    { OP_Open,    
11030 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
11040 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11050 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20  Rewind,      0, 
11060 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  6,        0},.  
11070 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
11080 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20        0, 3,     
11090 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
110a0 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30  P_SetInsert,   0
110b0 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
110c0 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
110d0 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20          0, 3,   
110e0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
110f0 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c   OP_IntegrityCk,
11100 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
11110 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
11120 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20  umnCount, 1, 0, 
11130 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
11140 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
11150 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
11160 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  "integrity_check
11170 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
11180 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
11190 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
111a0 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
111b0 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
111c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
111d0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
111e0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
111f0 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
11200 53 69 7a 65 28 63 68 65 63 6b 44 62 29 2c 20 63  Size(checkDb), c
11210 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65  heckDb);.  }else
11220 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46  ..  {}.  sqliteF
11230 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71  ree(zLeft);.  sq
11240 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29  liteFree(zRight)
11250 3b 0a 7d 0a                                      ;.}.