/ Hex Artifact Content
Login

Artifact 95eac6ce4ae2871388d49066c78dd0657ce40a1f:


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 37 20 32 30 30  ild.c,v 1.97 200
0310: 32 2f 30 36 2f 32 30 20 31 31 3a 33 36 3a 34 39  2/06/20 11:36:49
0320: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0330: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0340: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0350: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0360: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0370: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0380: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0390: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03a0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03b0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03c0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03d0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
03f0: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0400: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0410: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0420: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0430: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0440: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0450: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0460: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0470: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0480: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
0490: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04b0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04c0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04d0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04e0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
04f0: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0500: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0520: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0530: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0540: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0550: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0560: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0570: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0580: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
0590: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05a0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05b0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05d0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05e0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0610: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0630: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0640: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0650: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0660: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0670: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0680: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
0690: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06a0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06b0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06c0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06d0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06e0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0700: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0710: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0740: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0750: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0760: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0770: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0780: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
0790: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07a0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07c0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07d0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07e0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
07f0: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
0810: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0830: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0840: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0850: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0860: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0870: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0880: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0890: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
08a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
08b0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
08c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
08d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c    Table *p = sql
08e0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
08f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
0900: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
0910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
0920: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0930: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0940: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0950: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0960: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0970: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0980: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
0990: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
09a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
09b0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
09c0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
09d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
09e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73  {.  Index *p = s
09f0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0a00: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0a10: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0a20: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0a40: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0a50: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0a60: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0a70: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0a80: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0a90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0aa0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0ab0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0ac0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0ad0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0ae0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
0af0: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
0b00: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
0b10: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
0b20: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
0b30: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
0b40: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
0b50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
0b60: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0b70: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
0b80: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
0b90: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
0ba0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
0bb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
0bc0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
0bd0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
0be0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
0bf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
0c00: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
0c10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
0c20: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c30: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
0c40: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
0c50: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
0c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
0c70: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c80: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
0c90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
0cb0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0cc0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
0cd0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
0ce0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
0cf0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d00: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
0d10: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
0d20: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0d30: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
0d40: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
0d50: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
0d60: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
0d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
0d80: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
0d90: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
0da0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
0db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
0dc0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
0dd0: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
0de0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
0df0: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
0e00: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
0e10: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
0e20: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
0e30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
0e40: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
0e50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
0e60: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
0e70: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
0e80: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
0e90: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
0ea0: 78 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  x to the pending
0eb0: 20 44 52 4f 50 20 49 4e 44 45 58 20 71 75 65 75   DROP INDEX queu
0ec0: 65 20 69 66 20 69 74 20 68 61 73 0a 2a 2a 20 62  e if it has.** b
0ed0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  een committed.  
0ee0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 77 61  If this index wa
0ef0: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
0f00: 64 2c 20 74 68 65 6e 20 6a 75 73 74 0a 2a 2a 20  d, then just.** 
0f10: 64 65 6c 65 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  delete it..**.**
0f20: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
0f30: 70 65 6e 64 69 6e 67 20 64 72 6f 70 20 71 75 65  pending drop que
0f40: 75 65 20 61 72 65 20 64 65 6c 65 74 65 64 20 77  ue are deleted w
0f50: 68 65 6e 20 61 20 43 4f 4d 4d 49 54 20 69 73 0a  hen a COMMIT is.
0f60: 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  ** executed.  If
0f70: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75   a ROLLBACK occu
0f80: 72 73 2c 20 74 68 65 20 69 6e 64 69 63 65 73 20  rs, the indices 
0f90: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
0fa0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  nto.** the main 
0fb0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fd0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
0fe0: 6f 70 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  opIndex(sqlite *
0ff0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1000: 20 69 66 28 20 21 70 2d 3e 69 73 43 6f 6d 6d 69   if( !p->isCommi
1010: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  t ){.    sqliteU
1020: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1030: 64 65 78 28 64 62 2c 20 70 29 3b 0a 20 20 7d 65  dex(db, p);.  }e
1040: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1050: 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  pOld;.    pOld =
1060: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1070: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
1080: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
1090: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
10a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
10b0: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
10c0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
10d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10e0: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
10f0: 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a  , strlen(pOld->z
1100: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
1110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1120: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1130: 69 64 78 44 72 6f 70 2c 20 70 2c 20 30 2c 20 70  idxDrop, p, 0, p
1140: 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 72 6f 70  );.    p->isDrop
1150: 70 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ped = 1;.  }.}..
1160: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1170: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1180: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
1190: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
11a0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
11b0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11c0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
11d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
11e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
11f0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
1200: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
1210: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
1220: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
1230: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1240: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1250: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
1260: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1270: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1280: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
1290: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
12b0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
12c0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
12d0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
12e0: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
12f0: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
1300: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
1310: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
1320: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
1330: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
1340: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
1350: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
1360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
1370: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
1380: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  id sqliteDeleteT
1390: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
13a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
13b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65  .  int i;.  Inde
13c0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
13d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  t;.  if( pTable=
13e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
1400: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1420: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
1430: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
1440: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1450: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
1460: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1470: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
1480: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e  );.  }.  for(pIn
1490: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
14a0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
14b0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
14c0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
14d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
14e0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
14f0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
1500: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1510: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
1520: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1530: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
1540: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
1550: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
1560: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1570: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
1580: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
1590: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
15a0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
15b0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
15c0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
15d0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
15e0: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
15f0: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1600: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
1610: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
1620: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
1630: 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  pOld;.  assert( 
1640: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1650: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1660: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1670: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1680: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
16a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
16b0: 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49  );.  sqliteHashI
16c0: 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44 72  nsert(&db->tblDr
16d0: 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  op, p, 0, 0);.  
16e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
16f0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1700: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69 76 65  ** Move the give
1710: 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 70  n table to the p
1720: 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41 42 4c  ending DROP TABL
1730: 45 20 71 75 65 75 65 20 69 66 20 69 74 20 68 61  E queue if it ha
1740: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d 69 74  s.** been commit
1750: 74 65 64 2e 20 20 49 66 20 74 68 69 73 20 74 61  ted.  If this ta
1760: 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f  ble was never co
1770: 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6a 75  mmitted, then ju
1780: 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69 74 2e  st.** delete it.
1790: 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20 66 6f    Do the same fo
17a0: 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  r all its indice
17b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f  s..**.** Table o
17c0: 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65 75 65  n the drop queue
17d0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
17e0: 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69 6c 20  y deleted until 
17f0: 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74 61 74  a COMMIT.** stat
1800: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
1810: 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42 41 43  d.  If a ROLLBAC
1820: 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65 61 64  K occurs instead
1830: 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a 2a 2a   of a COMMIT,.**
1840: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   then the tables
1850: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1860: 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63  ue are moved bac
1870: 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a  k into the main.
1880: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ** hash table..*
1890: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18a0: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 54  litePendingDropT
18b0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
18c0: 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b 0a 20   Table *pTbl){. 
18d0: 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73 43 6f   if( !pTbl->isCo
18e0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
18f0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1900: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62 6c 29  eTable(db, pTbl)
1910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
1920: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
1930: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
1940: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c 64 20  pNext;.    pOld 
1950: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1960: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1970: 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74   pTbl->zName, st
1980: 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61 6d 65  rlen(pTbl->zName
1990: 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73 73 65  )+1,0);.    asse
19a0: 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c 20 29  rt( pOld==pTbl )
19b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
19c0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44  Insert(&db->tblD
19d0: 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20 70 54  rop, pTbl, 0, pT
19e0: 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  bl);.    for(pIn
19f0: 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49 6e 64  dex = pTbl->pInd
1a00: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a10: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  ex=pNext){.     
1a20: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
1a30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a40: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
1a50: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54  *.** Check all T
1a80: 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65  ables and Indexe
1a90: 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  s in the interna
1aa0: 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  l hash table and
1ab0: 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61   commit.** any a
1ac0: 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65  dditions or dele
1ad0: 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68  tions to those h
1ae0: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ash tables..**.*
1af0: 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67  * When executing
1b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e   CREATE TABLE an
1b10: 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  d CREATE INDEX s
1b20: 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54  tatements, the T
1b30: 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65  able.** and Inde
1b40: 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65  x structures are
1b50: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
1b60: 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ed to the hash t
1b70: 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68  ables, but.** th
1b80: 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65  e "isCommit" fie
1b90: 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20  ld is not set.  
1ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1bb0: 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  s those fields..
1bc0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1bd0: 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64  g DROP TABLE and
1be0: 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65   DROP INDEX, the
1bf0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1c00: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1c10: 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66 20 74  e moved out of t
1c20: 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78 48 61  blHash and idxHa
1c30: 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f 70 20  sh into tblDrop 
1c40: 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20 54 68  and idxDrop.  Th
1c50: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 65  is.** routine de
1c60: 6c 65 74 65 73 20 74 68 65 20 73 74 72 75 63 74  letes the struct
1c70: 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70 20 61  ure in tblDrop a
1c80: 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a 0a 2a  nd idxDrop..**.*
1c90: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
1ca0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1cb0: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
1cc0: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1cd0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1ce0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48  sqlite *db){.  H
1cf0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
1d00: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
1d10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
1d20: 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20 72 65  Changes)==0 ) re
1d30: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63 68 65  turn;.  db->sche
1d40: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1d50: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1d60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1d70: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1d80: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1d90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1da0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1db0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1dc0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1dd0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 61 62  pElem);.    pTab
1de0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  le->isCommit = 1
1df0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  ;.  }.  for(pEle
1e00: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1e10: 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70 29 3b  t(&db->tblDrop);
1e20: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e30: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e40: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1e50: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1e60: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1e80: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
1e90: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1ea0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 74  HashClear(&db->t
1eb0: 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72 28 70  blDrop);.  for(p
1ec0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1ed0: 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61 73  irst(&db->idxHas
1ee0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
1ef0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1f00: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1f10: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1f20: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1f30: 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  m);.    pIndex->
1f40: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1f50: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45 6c 65  }.  while( (pEle
1f60: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f70: 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29 29  t(&db->idxDrop))
1f80: 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  !=0 ){.    Index
1f90: 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74   *pIndex = sqlit
1fa0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  ;.    sqliteUnli
1fc0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1fd0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1fe0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
1ff0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
2000: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2010: 20 63 6f 6d 6d 69 74 20 66 6c 61 67 20 6f 6e 20   commit flag on 
2020: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 64 64  all triggers add
2030: 65 64 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ed this transact
2040: 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 70 45 6c  ion */.  for(pEl
2050: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2060: 73 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68  st(&db->trigHash
2070: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2080: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2090: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
20a0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
20b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
20c0: 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 72 69 67  Elem);.    pTrig
20d0: 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20  ger->isCommit = 
20e0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  1;.  }..  /* Del
20f0: 65 74 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ete the structur
2100: 65 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20  es for triggers 
2110: 72 65 6d 6f 76 65 64 20 74 68 69 73 20 74 72 61  removed this tra
2120: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 45  nsaction */.  pE
2130: 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68  lem = sqliteHash
2140: 46 69 72 73 74 28 26 64 62 2d 3e 74 72 69 67 44  First(&db->trigD
2150: 72 6f 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  rop);.  while( p
2160: 45 6c 65 6d 20 29 7b 0a 20 20 20 20 54 72 69 67  Elem ){.    Trig
2170: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
2180: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2190: 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Elem);.    sqlit
21a0: 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70  eDeleteTrigger(p
21b0: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 45  Trigger);.    pE
21c0: 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68  lem = sqliteHash
21d0: 4e 65 78 74 28 70 45 6c 65 6d 29 3b 0a 20 20 7d  Next(pElem);.  }
21e0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
21f0: 61 72 28 26 64 62 2d 3e 74 72 69 67 44 72 6f 70  ar(&db->trigDrop
2200: 29 3b 0a 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  );..  db->flags 
2210: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2220: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2240: 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72  runs when one or
2250: 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42   more CREATE TAB
2260: 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58  LE, CREATE INDEX
2270: 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c  ,.** DROP TABLE,
2280: 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73   or DROP INDEX s
2290: 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72  tatements gets r
22a0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65  olled back.  The
22b0: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72  .** additions or
22c0: 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61   deletions of Ta
22d0: 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74  ble and Index st
22e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a  ructures in the.
22f0: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2300: 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f   tables are undo
2310: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ne..**.** See al
2320: 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  so: sqliteCommit
2330: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2340: 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ).*/.void sqlite
2350: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
2360: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
2370: 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65  db){.  Hash toDe
2380: 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d  lete;.  HashElem
2390: 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28   *pElem;.  if( (
23a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
23b0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
23c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
23d0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28   sqliteHashInit(
23e0: 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54  &toDelete, SQLIT
23f0: 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20  E_HASH_POINTER, 
2400: 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63  0);.  db->next_c
2410: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65  ookie = db->sche
2420: 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72  ma_cookie;.  for
2430: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2440: 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48  hFirst(&db->tblH
2450: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
2460: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2470: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
2480: 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73  able *pTable = s
2490: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
24a0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70  lem);.    if( !p
24b0: 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20  Table->isCommit 
24c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48  ){.      sqliteH
24d0: 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c  ashInsert(&toDel
24e0: 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20  ete, pTable, 0, 
24f0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  pTable);.    }. 
2500: 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73   }.  for(pElem=s
2510: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2520: 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d  toDelete); pElem
2530: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
2540: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
2550: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c      Table *pTabl
2560: 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  e = sqliteHashDa
2570: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73  ta(pElem);.    s
2580: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
2590: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
25a0: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  able);.  }.  sql
25b0: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f  iteHashClear(&to
25c0: 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70  Delete);.  for(p
25d0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
25e0: 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f  irst(&db->tblDro
25f0: 70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  p); pElem; pElem
2600: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2610: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
2620: 6c 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73  le *pOld, *p = s
2630: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2640: 6c 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  lem);.    assert
2650: 28 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b  ( p->isCommit );
2660: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
2670: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2680: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
2690: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
26a0: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
26b0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
26c0: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
26d0: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
26e0: 6c 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f  lear(&db->tblDro
26f0: 70 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  p);.  for(pElem=
2700: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2710: 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  &db->idxHash); p
2720: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2730: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2740: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
2750: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61  Index = sqliteHa
2760: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2770: 20 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e     if( !pIndex->
2780: 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
2790: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
27a0: 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49  rt(&toDelete, pI
27b0: 6e 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29  ndex, 0, pIndex)
27c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
27d0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27e0: 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74  shFirst(&toDelet
27f0: 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  e); pElem; pElem
2800: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2810: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
2820: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2830: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2840: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
2850: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2860: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2870: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2880: 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29  Clear(&toDelete)
2890: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
28a0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
28b0: 62 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c  b->idxDrop); pEl
28c0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
28d0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
28e0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c  {.    Index *pOl
28f0: 64 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61  d, *p = sqliteHa
2900: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2910: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
2920: 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d  Commit );.    p-
2930: 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a  >isDropped = 0;.
2940: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2950: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2960: 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >idxHash, p->zNa
2970: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
2980: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
2990: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
29a0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
29b0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
29c0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
29d0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
29e0: 61 6e 79 20 74 72 69 67 67 65 72 73 20 74 68 61  any triggers tha
29f0: 74 20 68 61 76 65 6e 27 74 20 62 65 65 6e 20 63  t haven't been c
2a00: 6f 6d 6d 69 74 65 64 20 79 65 74 20 2a 2f 0a 20  ommited yet */. 
2a10: 20 66 6f 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c   for(pElem = sql
2a20: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
2a30: 2d 3e 74 72 69 67 48 61 73 68 29 3b 20 70 45 6c  ->trigHash); pEl
2a40: 65 6d 3b 20 0a 20 20 20 20 20 20 70 45 6c 65 6d  em; .      pElem
2a50: 20 3d 20 28 70 45 6c 65 6d 3f 73 71 6c 69 74 65   = (pElem?sqlite
2a60: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 3a  HashNext(pElem):
2a70: 30 29 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  0)){.    Trigger
2a80: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c   *pTrigger = sql
2a90: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2aa0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 72  m);.    if( !pTr
2ab0: 69 67 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74 20  igger->isCommit 
2ac0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2ad0: 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTbl = sqliteFin
2ae0: 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72 69 67  dTable(db, pTrig
2af0: 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20  ger->table);.   
2b00: 20 20 20 69 66 28 20 70 54 62 6c 20 29 7b 0a 20     if( pTbl ){. 
2b10: 20 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 2d         if( pTbl-
2b20: 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54 72  >pTrigger == pTr
2b30: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
2b40: 20 20 20 70 54 62 6c 2d 3e 70 54 72 69 67 67 65     pTbl->pTrigge
2b50: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
2b60: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ext;.        }el
2b70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54 72  se{.          Tr
2b80: 69 67 67 65 72 20 2a 63 63 20 3d 20 70 54 62 6c  igger *cc = pTbl
2b90: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
2ba0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 63 20        while( cc 
2bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2bc0: 66 28 20 63 63 2d 3e 70 4e 65 78 74 20 3d 3d 20  f( cc->pNext == 
2bd0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
2be0: 20 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70 4e            cc->pN
2bf0: 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d  ext = cc->pNext-
2c00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
2c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c30: 20 20 20 20 20 20 20 63 63 20 3d 20 63 63 2d 3e         cc = cc->
2c40: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
2c50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2c60: 65 72 74 28 63 63 29 3b 0a 20 20 20 20 20 20 20  ert(cc);.       
2c70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c80: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
2c90: 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68 2c  t(&db->trigHash,
2ca0: 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c   pTrigger->name,
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  .              1
2cc0: 20 2b 20 73 74 72 6c 65 6e 28 70 54 72 69 67 67   + strlen(pTrigg
2cd0: 65 72 2d 3e 6e 61 6d 65 29 2c 20 30 29 3b 0a 20  er->name), 0);. 
2ce0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
2cf0: 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  eTrigger(pTrigge
2d00: 72 29 3b 0a 20 20 20 20 20 20 70 45 6c 65 6d 20  r);.      pElem 
2d10: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
2d20: 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68 29  t(&db->trigHash)
2d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d40: 2a 20 41 6e 79 20 74 72 69 67 67 65 72 73 20 74  * Any triggers t
2d50: 68 61 74 20 77 65 72 65 20 64 72 6f 70 70 65 64  hat were dropped
2d60: 20 2d 20 70 75 74 20 27 65 6d 20 62 61 63 6b 20   - put 'em back 
2d70: 69 6e 20 70 6c 61 63 65 20 2a 2f 0a 20 20 66 6f  in place */.  fo
2d80: 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65  r(pElem = sqlite
2d90: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74  HashFirst(&db->t
2da0: 72 69 67 44 72 6f 70 29 3b 20 70 45 6c 65 6d 3b  rigDrop); pElem;
2db0: 20 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20   .      pElem = 
2dc0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2dd0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
2de0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
2df0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2e00: 45 6c 65 6d 29 3b 0a 20 20 20 20 54 61 62 6c 65  Elem);.    Table
2e10: 20 2a 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46   *pTbl = sqliteF
2e20: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72  indTable(db, pTr
2e30: 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20  igger->table);. 
2e40: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2e50: 65 72 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73  ert(&db->trigHas
2e60: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  h, pTrigger->nam
2e70: 65 2c 20 0a 20 20 20 20 20 20 20 20 73 74 72 6c  e, .        strl
2e80: 65 6e 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  en(pTrigger->nam
2e90: 65 29 20 2b 20 31 2c 20 70 54 72 69 67 67 65 72  e) + 1, pTrigger
2ea0: 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d  );.    pTrigger-
2eb0: 3e 70 4e 65 78 74 20 3d 20 70 54 62 6c 2d 3e 70  >pNext = pTbl->p
2ec0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70 54 62  Trigger;.    pTb
2ed0: 6c 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  l->pTrigger = pT
2ee0: 72 69 67 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 73  rigger;.  }..  s
2ef0: 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26  qliteHashClear(&
2f00: 64 62 2d 3e 74 72 69 67 44 72 6f 70 29 3b 0a 20  db->trigDrop);. 
2f10: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2f20: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2f30: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ges;.}../*.** Co
2f40: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
2f50: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
2f60: 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61   or index from a
2f70: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
2f80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2f90: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
2fa0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
2fb0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
2fc0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
2fd0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2fe0: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
2ff0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
3000: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
3010: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
3020: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
3030: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3040: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
3050: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3060: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
3070: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
3080: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
3090: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
30a0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
30b0: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
30c0: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
30d0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
30e0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
30f0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
3100: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
3110: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
3120: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
3130: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3140: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
3150: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
3160: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
3170: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
3180: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
3190: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
31a0: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
31b0: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
31c0: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
31d0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
31e0: 20 69 66 20 74 68 65 20 22 54 45 4d 50 22 20 6f   if the "TEMP" o
31f0: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
3200: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
3210: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
3220: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
3230: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
3240: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
3250: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
3260: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
3270: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
3280: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
3290: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
32a0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
32b0: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
32c0: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
32d0: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
32e0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
32f0: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
3300: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
3310: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
3320: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
3330: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
3340: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
3350: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
3360: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
3370: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
3380: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
3390: 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  id sqliteStartTa
33a0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
33b0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  e, Token *pStart
33c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
33d0: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54  int isTemp){.  T
33e0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
33f0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
3400: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
3410: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
3420: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
3430: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69  ;..  pParse->sFi
3440: 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61  rstToken = *pSta
3450: 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  rt;.  zName = sq
3460: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
3470: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
3480: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
3490: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
34a0: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63  fore trying to c
34b0: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
34c0: 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75  y table, make su
34d0: 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72  re the Btree for
34e0: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65  .  ** holding te
34f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69  mporary tables i
3500: 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  s open..  */.  i
3510: 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d  f( isTemp && db-
3520: 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  >pBeTemp==0 ){. 
3530: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
3540: 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  teBtreeOpen(0, 0
3550: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
3560: 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
3570: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3580: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
3590: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
35a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
35b0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
35c0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
35d0: 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
35e0: 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
35f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
3600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
3610: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3620: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3630: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
3640: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
3650: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
3660: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
3670: 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65 54 65  nTrans(db->pBeTe
3680: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
3690: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
36b0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
36c0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
36d0: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
36e0: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
36f0: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
3700: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
3710: 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  le", 0);.       
3720: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3730: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
3740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3750: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
3760: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
3770: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
3780: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
3790: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
37a0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
37b0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
37c0: 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20  r message if it 
37d0: 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  does..  **.  ** 
37e0: 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61  If we are re-rea
37f0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
3800: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
3810: 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61  ause of a schema
3820: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64  .  ** change and
3830: 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74   a new permanent
3840: 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20   table is found 
3850: 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69  whose name colli
3860: 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  des with.  ** an
3870: 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72   existing tempor
3880: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ary table, then 
3890: 69 67 6e 6f 72 65 20 74 68 65 20 6e 65 77 20 70  ignore the new p
38a0: 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a  ermanent table..
38b0: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e    ** We will con
38c0: 74 69 6e 75 65 20 70 61 72 73 69 6e 67 2c 20 62  tinue parsing, b
38d0: 75 74 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  ut the pParse->n
38e0: 61 6d 65 43 6c 61 73 68 20 66 6c 61 67 20 77 69  ameClash flag wi
38f0: 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a 20 73  ll be set.  ** s
3900: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74  o we will know t
3910: 6f 20 64 69 73 63 61 72 64 20 74 68 65 20 74 61  o discard the ta
3920: 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63 65 20  ble record once 
3930: 70 61 72 73 69 6e 67 20 68 61 73 20 66 69 6e 69  parsing has fini
3940: 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  shed..  */.  pTa
3950: 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ble = sqliteFind
3960: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29  Table(db, zName)
3970: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  ;.  if( pTable!=
3980: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  0 ){.    if( pTa
3990: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  ble->isTemp && p
39a0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
39b0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
39c0: 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a  >nameClash = 1;.
39d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
39e0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
39f0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3a00: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c  sg, "table ", 0,
3a10: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
3a20: 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ->n,.          "
3a30: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
3a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3a50: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3a60: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3a70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
3a80: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  turn;.    }.  }e
3a90: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
3aa0: 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a  >nameClash = 0;.
3ab0: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
3ac0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
3ad0: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  x(db, zName))!=0
3ae0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 21   &&.          (!
3af0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73  pIdx->pTable->is
3b00: 54 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65 2d  Temp || !pParse-
3b10: 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20  >initFlag) ){.  
3b20: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3b30: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3b40: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
3b50: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
3b60: 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20  amed ", .       
3b70: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
3b80: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3b90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
3ba0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
3bb0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
3bc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
3bd0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
3be0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3bf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
3c00: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
3c10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
3c20: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
3c30: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
3c40: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3c50: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
3c60: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
3c70: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
3c80: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
3c90: 3e 69 73 54 65 6d 70 20 3d 20 69 73 54 65 6d 70  >isTemp = isTemp
3ca0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3cb0: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
3cc0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
3cd0: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
3ce0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
3cf0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
3d00: 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  le;..  /* Begin 
3d10: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
3d20: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
3d30: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
3d40: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
3d50: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
3d60: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
3d70: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
3d80: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
3d90: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
3da0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
3db0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
3dc0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
3dd0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
3de0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
3df0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
3e00: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
3e10: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
3e20: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
3e30: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
3e40: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
3e50: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
3e60: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
3e70: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
3e80: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
3e90: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
3ea0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
3eb0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
3ec0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
3ed0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28  e->initFlag && (
3ee0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
3ef0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
3f00: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
3f10: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3f20: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 69  Parse, 0);.    i
3f30: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3f40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3f50: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3f60: 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  r, db->file_form
3f70: 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  at, 0);.      sq
3f80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f90: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
3fa0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3fc0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
3fd0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
3fe0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3ff0: 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  -1, MASTER_NAME,
4000: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4010: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4020: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
4030: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
4040: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4050: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4070: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4080: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
4090: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
40a0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
40b0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ey, 0, 0);.    }
40c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
40d0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
40e0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
40f0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
4100: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
4110: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
4120: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
4130: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4140: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
4150: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
4160: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
4170: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
4180: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
4190: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
41a0: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
41b0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
41c0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
41d0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
41e0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
41f0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
4200: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
4210: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4220: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4230: 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  z = 0;.  Column 
4240: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
4250: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4260: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4270: 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
4280: 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e  ring(&z, pName->
4290: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
42a0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
42b0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
42c0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
42d0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
42e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
42f0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70  liteStrICmp(z, p
4300: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
4310: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4320: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
4330: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4340: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
4350: 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30 29 3b   name: ", z, 0);
4360: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4370: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
4380: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
4390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
43a0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
43b0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
43c0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
43d0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
43e0: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
43f0: 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29  Col, (p->nCol+8)
4400: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
4410: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
4420: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
4430: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
4440: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
4450: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
4460: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
4470: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
4480: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
4490: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20  l->zName = z;.  
44a0: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
44b0: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  = SQLITE_SO_NUM;
44c0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
44d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
44e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
44f0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
4500: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
4510: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
4520: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4530: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
4540: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
4550: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
4560: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
4570: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4580: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
4590: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
45a0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
45b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
45c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
45d0: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
45e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
45f0: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
4600: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
4610: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4620: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4630: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
4640: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
4650: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
4660: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  .notNull = onErr
4670: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
4680: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4690: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
46a0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
46b0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
46c0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
46d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
46e0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
46f0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
4700: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
4710: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
4720: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
4730: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
4740: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
4750: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
4760: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
4770: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
4780: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
4790: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
47a0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
47b0: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
47c0: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
47d0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
47e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
47f0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
4800: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
4810: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  / .void sqliteAd
4820: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
4830: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4840: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
4850: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
4860: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
4870: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
4880: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c   *z, **pz;.  Col
4890: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
48a0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
48b0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
48c0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
48d0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
48e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
48f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
4900: 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a  .  pz = &pCol->z
4910: 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73  Type;.  n = pLas
4920: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73  t->n + Addr(pLas
4930: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69  t->z) - Addr(pFi
4940: 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  rst->z);.  sqlit
4950: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
4960: 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29  pFirst->z, n, 0)
4970: 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69  ;.  z = *pz;.  i
4980: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
4990: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
49a0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
49b0: 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  nt c = z[i];.   
49c0: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
49d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
49e0: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
49f0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43    z[j] = 0;.  pC
4a00: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
4a10: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
4a20: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
4a30: 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68  i++){.    switch
4a40: 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ( z[i] ){.      
4a50: 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20 20 20  case 'c':.      
4a60: 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20 20  case 'C': {.    
4a70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
4a80: 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c 22 63 68  rNICmp(&z[i],"ch
4a90: 61 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20  ar",4)==0 ||.   
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
4ab0: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69  iteStrNICmp(&z[i
4ac0: 5d 2c 22 63 6c 6f 62 22 2c 34 29 3d 3d 30 20 29  ],"clob",4)==0 )
4ad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
4ae0: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51  ->sortOrder = SQ
4af0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
4b00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
4b10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4b30: 0a 20 20 20 20 20 20 63 61 73 65 20 27 78 27 3a  .      case 'x':
4b40: 0a 20 20 20 20 20 20 63 61 73 65 20 27 58 27 3a  .      case 'X':
4b50: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
4b60: 3e 3d 32 20 26 26 20 73 71 6c 69 74 65 53 74 72  >=2 && sqliteStr
4b70: 4e 49 43 6d 70 28 26 7a 5b 69 2d 32 5d 2c 22 74  NICmp(&z[i-2],"t
4b80: 65 78 74 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  ext",4)==0 ){.  
4b90: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 73 6f          pCol->so
4ba0: 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
4bb0: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  _SO_TEXT;.      
4bc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
4be0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4bf0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65  ../*.** The give
4c30: 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64  n token is the d
4c40: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
4c50: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
4c60: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65   added to.** the
4c70: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
4c80: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4c90: 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46  ion.  If "minusF
4ca0: 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74  lag" is true, it
4cb0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61  .** means the va
4cc0: 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72  lue token was pr
4cd0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
4ce0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  s sign..**.** Th
4cf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4d00: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
4d10: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4d20: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4d30: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4d40: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
4d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
4d60: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
4d70: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
4d80: 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e  n *pVal, int min
4d90: 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65  usFlag){.  Table
4da0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
4db0: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
4dc0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4dd0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4de0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4df0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
4e00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
4e10: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
4e20: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
4e30: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
4e40: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
4e50: 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a   "-", 1, pVal->z
4e60: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
4e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
4e80: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
4e90: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
4ea0: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n, 0);.  }.  sql
4eb0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
4ec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
4ed0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
4ee0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
4ef0: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
4f00: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
4f10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
4f20: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
4f30: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
4f40: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
4f50: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
4f60: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
4f70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
4f80: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
4f90: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
4fa0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
4fb0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
4fc0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
4fd0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
4fe0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
4ff0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
5000: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
5010: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
5020: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
5030: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
5040: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
5050: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
5060: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
5070: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
5080: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
5090: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
50a0: 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63  he row id.  (Exc
50b0: 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62  eption:.** For b
50c0: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
50d0: 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
50e0: 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20  r databases, do 
50f0: 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69  not do this.** i
5100: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
5110: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  t version number
5120: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   is less than 1.
5130: 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  )  Set the Table
5140: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
5150: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
5160: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5170: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
5180: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
5190: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
51a0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
51b0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
51c0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
51d0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
51e0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
51f0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
5200: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
5210: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
5220: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
5230: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
5240: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
5250: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
5260: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
5270: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
5280: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72  ddPrimaryKey(Par
5290: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
52a0: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f  st *pList, int o
52b0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
52c0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
52d0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
52e0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
52f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
5300: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
5310: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
5320: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
5330: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
5340: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
5350: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 5c  ErrMsg, "table \
5360: 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  "", pTab->zName,
5370: 20 0a 20 20 20 20 20 20 20 20 22 5c 22 20 68 61   .        "\" ha
5380: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
5390: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 30 29  primary key", 0)
53a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
53b0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
53c0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
53d0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
53e0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
53f0: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
5400: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d 65 6c  >nCol - 1;.  }el
5410: 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  se if( pList->nI
5420: 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28  d==1 ){.    for(
5430: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
5440: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
5450: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
5460: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
5470: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[0].zName, pTa
5480: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
5490: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
54a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
54b0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
54c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
54d0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
54e0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
54f0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
5500: 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f  rse->db->file_fo
5510: 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20  rmat>=1 && .    
5520: 20 20 20 20 20 20 20 7a 54 79 70 65 20 26 26 20         zType && 
5530: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54  sqliteStrICmp(zT
5540: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
5550: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  =0 ){.    pTab->
5560: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
5570: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
5580: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c  = onError;.  }el
5590: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 72  se{.    sqliteCr
55a0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
55b0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
55c0: 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  nError, 0, 0);. 
55d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
55e0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
55f0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70  te collating typ
5600: 65 20 67 69 76 65 6e 20 74 68 65 20 63 6f 6c 6c  e given the coll
5610: 61 74 69 6f 6e 20 74 79 70 65 20 74 6f 6b 65 6e  ation type token
5620: 2e 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65  ..** Report an e
5630: 72 72 6f 72 20 69 66 20 74 68 65 20 74 79 70 65  rror if the type
5640: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
5650: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 6c 6c  /.int sqliteColl
5660: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
5670: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
5680: 79 70 65 29 7b 0a 20 20 69 66 28 20 70 54 79 70  ype){.  if( pTyp
5690: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
56a0: 4c 49 54 45 5f 53 4f 5f 55 4e 4b 3b 0a 20 20 69  LITE_SO_UNK;.  i
56b0: 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 34 20 26  f( pType->n==4 &
56c0: 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  & sqliteStrNICmp
56d0: 28 70 54 79 70 65 2d 3e 7a 2c 20 22 74 65 78 74  (pType->z, "text
56e0: 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 4)==0 ){.    
56f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
5700: 5f 54 45 58 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _TEXT;.  }.  if(
5710: 20 70 54 79 70 65 2d 3e 6e 3d 3d 37 20 26 26 20   pType->n==7 && 
5720: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
5730: 54 79 70 65 2d 3e 7a 2c 20 22 6e 75 6d 65 72 69  Type->z, "numeri
5740: 63 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  c", 7)==0 ){.   
5750: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5760: 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c  O_NUM;.  }.  sql
5770: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
5780: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
5790: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69  "unknown collati
57a0: 6e 67 20 74 79 70 65 3a 20 22 2c 20 2d 31 2c 0a  ng type: ", -1,.
57b0: 20 20 20 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54      pType->z, pT
57c0: 79 70 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 70 50  ype->n, 0);.  pP
57d0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
57e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
57f0: 5f 55 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  _UNK;.}../*.** T
5800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5810: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
5820: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
5830: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
5840: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
5850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5860: 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61   A "COLLATE" cla
5870: 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  use has.** been 
5880: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
5890: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
58a0: 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e  sets the Column.
58b0: 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20  sortOrder on.** 
58c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
58d0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
58e0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
58f0: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61 74   sqliteAddCollat
5900: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
5910: 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70  rse, int collTyp
5920: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
5930: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
5940: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
5950: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
5960: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
5970: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
5980: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72  ) p->aCol[i].sor
5990: 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70  tOrder = collTyp
59a0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65  e;.}../*.** Come
59b0: 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72   up with a new r
59c0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20  andom value for 
59d0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
59e0: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a  e.  Make sure.**
59f0: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
5a00: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
5a10: 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20   the old..**.** 
5a20: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
5a30: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
5a40: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
5a50: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
5a60: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
5a70: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
5a80: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
5a90: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
5aa0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
5ab0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
5ac0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
5ad0: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
5ae0: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
5af0: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
5b00: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
5b10: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
5b20: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
5b30: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
5b40: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
5b50: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
5b60: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
5b70: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
5b80: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
5b90: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
5ba0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
5bb0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
5bc0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
5bd0: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
5be0: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
5bf0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
5c00: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
5c10: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
5c20: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
5c30: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
5c40: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
5c50: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
5c60: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
5c70: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
5c80: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
5c90: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
5ca0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
5cb0: 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61 6e 67  void sqliteChang
5cc0: 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a  eCookie(sqlite *
5cd0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  db){.  if( db->n
5ce0: 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e  ext_cookie==db->
5cf0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b  schema_cookie ){
5d00: 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  .    db->next_co
5d10: 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d  okie = db->schem
5d20: 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74  a_cookie + sqlit
5d30: 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20  eRandomByte() + 
5d40: 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  1;.    db->flags
5d50: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
5d60: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
5d70: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
5d80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
5d90: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
5da0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
5db0: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
5dc0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
5dd0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
5de0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
5df0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
5e00: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
5e10: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
5e20: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
5e30: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
5e40: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
5e50: 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20    int needQuote 
5e60: 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  = 0;.  for(n=0; 
5e70: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
5e80: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20     if( *z=='\'' 
5e90: 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74  ){ n++; needQuot
5ea0: 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  e=1; }.  }.  ret
5eb0: 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74  urn n + needQuot
5ec0: 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  e*2;.}../*.** Wr
5ed0: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
5ee0: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
5ef0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
5f00: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
5f10: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
5f20: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
5f30: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
5f40: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
5f50: 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  dx, char *zIdent
5f60: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  ){.  int i, j, n
5f70: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
5f80: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
5f90: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
5fa0: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
5fb0: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
5fc0: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
5fd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fe0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
5ff0: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
6000: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f    || sqliteKeywo
6030: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
6040: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
6050: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
6060: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72  +] = '\'';.  for
6070: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
6080: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
6090: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
60a0: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
60b0: 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20  =='\'' ) z[i++] 
60c0: 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66  = '\'';.  }.  if
60d0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
60e0: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a  i++] = '\'';.  z
60f0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
6100: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
6110: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
6120: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6130: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6140: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
6150: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
6160: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
6170: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
6180: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
6190: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
61a0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
61b0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
61c0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
61d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
61e0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62  ateTableStmt(Tab
61f0: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
6200: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
6210: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
6220: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
6230: 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  d;.  n = 0;.  fo
6240: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
6250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  ; i++){.    n +=
6260: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
6270: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
6280: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
6290: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
62a0: 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a  ;.  if( n<40 ){.
62b0: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
62c0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
62d0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
62e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
62f0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
6300: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
6310: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
6320: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 32 35  ";.  }.  n += 25
6330: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
6340: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  zStmt = sqliteMa
6350: 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28  lloc( n );.  if(
6360: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
6370: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
6380: 21 70 2d 3e 69 73 54 65 6d 70 20 29 3b 0a 20 20  !p->isTemp );.  
6390: 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 22 43  strcpy(zStmt, "C
63a0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
63b0: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
63c0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
63d0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
63e0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
63f0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
6400: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6410: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  i++){.    strcpy
6420: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
6430: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
6440: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
6450: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
6460: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
6470: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c  tmt, &k, p->aCol
6480: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
6490: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
64a0: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
64b0: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
64c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
64d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
64e0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
64f0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
6500: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
6510: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6520: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
6530: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
6540: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
6550: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
6560: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
6570: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
6580: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
6590: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
65a0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
65b0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
65c0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
65d0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
65e0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
65f0: 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73  n disk,.** unles
6600: 73 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  s this is a temp
6610: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69  orary table or i
6620: 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65  nitFlag==1.  Whe
6630: 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a  n initFlag==1,.*
6640: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
6650: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
6660: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6670: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
6680: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
6690: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
66a0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
66b0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
66c0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
66d0: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
66e0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
66f0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
6700: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
6710: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
6720: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
6730: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
6740: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
6750: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
6760: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
6770: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
6780: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
6790: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
67a0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
67b0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
67c0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
67d0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
67e0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
67f0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
6800: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
6810: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
6820: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
6830: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
6840: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64  /.void sqliteEnd
6850: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
6860: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  rse, Token *pEnd
6870: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
6880: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
6890: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
68a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
68b0: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
68c0: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
68d0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
68e0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
68f0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
6900: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6910: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
6920: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
6930: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
6940: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
6950: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
6960: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
6970: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
6980: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d  arse->nameClash=
6990: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e  =0 || pParse->in
69a0: 69 74 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  itFlag==1 );.  i
69b0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
69c0: 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  in==0 && pParse-
69d0: 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b  >nameClash==0 ){
69e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
69f0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
6a00: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
6a10: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
6a20: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
6a30: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
6a40: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
6a50: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
6a60: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
6a70: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
6a80: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
6a90: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
6aa0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6ab0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
6ac0: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
6ad0: 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64  >nTable++;.    d
6ae0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
6af0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
6b00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6b10: 68 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65  he table is gene
6b20: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c  rated from a SEL
6b30: 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72  ECT, then constr
6b40: 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  uct the.  ** lis
6b50: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  t of columns and
6b60: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
6b70: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
6b80: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
6b90: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
6ba0: 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53   = sqliteResultS
6bb0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
6bc0: 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e, 0, pSelect);.
6bd0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
6be0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
6bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
6c00: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43  ==0 );.    p->nC
6c10: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
6c20: 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  ol;.    p->aCol 
6c30: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
6c40: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
6c50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
6c60: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
6c70: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
6c80: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
6c90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6ca0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
6cb0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
6cc0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
6cd0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
6ce0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
6cf0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
6d00: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
6d10: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
6d20: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
6d30: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
6d40: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6d50: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 0a  table from the .
6d60: 20 20 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 65 77    ** pParse->new
6d70: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
6d80: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 73 68  e page number sh
6d90: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
6da0: 75 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 62 79  ut.  ** there by
6db0: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
6dc0: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f  b routine.).  */
6dd0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
6de0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 70  nitFlag ){.    p
6df0: 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d  ->tnum = pParse-
6e00: 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  >newTnum;.  }.. 
6e10: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
6e20: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
6e30: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
6e40: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
6e50: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
6e60: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
6e70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
6e80: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
6e90: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
6ea0: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
6eb0: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
6ec0: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
6ed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
6ee0: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
6ef0: 59 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6a 75  Y table, then ju
6f00: 73 74 20 63 72 65 61 74 65 20 74 68 65 20 74 61  st create the ta
6f10: 62 6c 65 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 2a  ble.  Do not.  *
6f20: 2a 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * make an entry 
6f30: 69 6e 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  in SQLITE_MASTER
6f40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
6f50: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
6f60: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
6f70: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
6f80: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
6f90: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
6fa0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
6fb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
6fc0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
6fd0: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
6fe0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
6ff0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7000: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
7010: 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  , p->isTemp);.  
7020: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
7030: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
7040: 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20  har *)&p->tnum, 
7050: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
7060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
7070: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
7080: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7090: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
70a0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
70b0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20   p->tnum = 0;.  
70c0: 20 20 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70    if( !p->isTemp
70d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
70e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
70f0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
7100: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7110: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7120: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
7130: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
7140: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7150: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7160: 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33   -1, "table", P3
7170: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
7180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7190: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
71a0: 33 28 76 2c 20 2d 31 2c 20 22 76 69 65 77 22 2c  3(v, -1, "view",
71b0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
71c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
71d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
71e0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
71f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7200: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7210: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  p->zName, P3_STA
7220: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
7230: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7240: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7260: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
7270: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54   p->zName, P3_ST
7280: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
7290: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
72a0: 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20  OP_Dup, 4, 0);. 
72b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
72c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
72d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
72e0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
72f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
7300: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
7310: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  (p);.        n =
7320: 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a   z ? strlen(z) :
7330: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
7340: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7350: 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
7360: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7370: 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
7380: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7390: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
73a0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
73b0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
73c0: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
73d0: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  .z) + 1;.       
73e0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
73f0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73  eP3(v, -1, pPars
7400: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
7410: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
7420: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7430: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
7440: 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20  cord, 5, 0);.   
7450: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7460: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
7470: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ey, 0, 0);.     
7480: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
7490: 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73  kie(db);.      s
74a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
74b0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
74c0: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30  ->next_cookie, 0
74d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
74e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
74f0: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b  etCookie, 0, 0);
7500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7510: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
7520: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  se, 0, 0);.    }
7530: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
7540: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
7550: 20 3d 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 4f   = p->isTemp ? O
7560: 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50  P_OpenWrAux : OP
7570: 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
7580: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7590: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 30 29 3b 0a  p(v, op, 1, 0);.
75a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
75b0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
75c0: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
75d0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
75e0: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
75f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
7600: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
7610: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
7620: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
7630: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
7640: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
7650: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
7660: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
7670: 73 71 6c 69 74 65 43 72 65 61 74 65 56 69 65 77  sqliteCreateView
7680: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7690: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
76a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
76b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
76c0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
76d0: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
76e0: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
76f0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
7700: 70 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54  pName,      /* T
7710: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
7720: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
7730: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
7740: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
7750: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
7760: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
7770: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
7780: 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  view */.){.  Tok
7790: 65 6e 20 73 45 6e 64 3b 0a 20 20 54 61 62 6c 65  en sEnd;.  Table
77a0: 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p;.  const cha
77b0: 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 2c 20 6f  r *z;.  int n, o
77c0: 66 66 73 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ffset;..  sqlite
77d0: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
77e0: 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65  e, pBegin, pName
77f0: 2c 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 0);.  p = pPar
7800: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
7810: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
7820: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
7830: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
7840: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7850: 2f 2a 20 49 67 6e 6f 72 65 20 4f 52 44 45 52 20  /* Ignore ORDER 
7860: 42 59 20 63 6c 61 75 73 65 73 20 6f 6e 20 61 20  BY clauses on a 
7870: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
7880: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
7890: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  y ){.    sqliteE
78a0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
78b0: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 29  elect->pOrderBy)
78c0: 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70  ;.    pSelect->p
78d0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
78e0: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
78f0: 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 21  pSelect;.  if( !
7900: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
7910: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
7920: 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
7930: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 20  ames(pParse, p) 
7940: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
7950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 45 6e  .    }.  }.  sEn
7960: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
7970: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
7980: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
7990: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
79a0: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
79b0: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
79c0: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28  .n = 0;.  n = ((
79d0: 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69  int)sEnd.z) - (i
79e0: 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  nt)pBegin->z;.  
79f0: 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
7a00: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28   while( n>0 && (
7a10: 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  z[n-1]==';' || i
7a20: 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20  sspace(z[n-1])) 
7a30: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
7a40: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
7a50: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 20 20 7a 20  sEnd.n = 1;.  z 
7a60: 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 7a 53  = p->pSelect->zS
7a70: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 74  elect = sqliteSt
7a80: 72 4e 44 75 70 28 7a 2c 20 6e 29 3b 0a 20 20 69  rNDup(z, n);.  i
7a90: 66 28 20 7a 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( z ){.    offs
7aa0: 65 74 20 3d 20 28 28 69 6e 74 29 7a 29 20 2d 20  et = ((int)z) - 
7ab0: 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  (int)pBegin->z;.
7ac0: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
7ad0: 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d 3e 70  MoveStrings(p->p
7ae0: 53 65 6c 65 63 74 2c 20 6f 66 66 73 65 74 29 3b  Select, offset);
7af0: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 54 61  .    sqliteEndTa
7b00: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
7b10: 64 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  d, 0);.  }.  ret
7b20: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
7b30: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
7b40: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
7b50: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
7b60: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
7b70: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
7b80: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
7b90: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
7ba0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
7bb0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
7bc0: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
7bd0: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
7be0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7bf0: 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72 72  e in pPare->zErr
7c00: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
7c10: 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
7c20: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
7c30: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
7c40: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
7c50: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
7c60: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
7c70: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
7c80: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
7c90: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
7ca0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
7cb0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
7cc0: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
7cd0: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
7ce0: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
7cf0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
7d00: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
7d10: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
7d20: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
7d30: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
7d40: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
7d50: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
7d60: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
7d70: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
7d80: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
7d90: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
7da0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
7db0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
7dc0: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
7dd0: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
7de0: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
7df0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
7e00: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
7e10: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
7e20: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
7e30: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
7e40: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
7e50: 6f 6e 65 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one;.  */.  if( 
7e60: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
7e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
7e80: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
7e90: 45 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c  ErrMsg, "view ",
7ea0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
7eb0: 20 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69           " is ci
7ec0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
7ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
7ee0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
7ef0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
7f00: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
7f10: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
7f20: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
7f30: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
7f40: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
7f50: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
7f60: 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c  ct ); /* If nCol
7f70: 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65  ==0, then pTable
7f80: 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20   must be a VIEW 
7f90: 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62  */.  pSel = pTab
7fa0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  le->pSelect;..  
7fb0: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  /* Note that the
7fc0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52   call to sqliteR
7fd0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
7fe0: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
7ff0: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
8000: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
8010: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
8020: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
8030: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
8040: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
8050: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
8060: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
8070: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
8080: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
8090: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
80a0: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
80b0: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
80c0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
80d0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
80e0: 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70  pEList);.  if( p
80f0: 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29  Sel->pEList==0 )
8100: 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69  {.    pSel->pELi
8110: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
8120: 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d   return 1;  /* M
8130: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
8140: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43    }.  pTable->nC
8150: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54  ol = -1;.  pSelT
8160: 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c  ab = sqliteResul
8170: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
8180: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
8190: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
81a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
81b0: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
81c0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
81d0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
81e0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
81f0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
8200: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
8210: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
8220: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
8230: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
8240: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
8250: 62 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  b);.    pParse->
8260: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
8270: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
8280: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8290: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
82a0: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
82b0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55  .  sqliteSelectU
82c0: 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73  nbind(pSel);.  s
82d0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
82e0: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
82f0: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
8300: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
8310: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a  turn nErr;  .}..
8320: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
8330: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
8340: 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c  m the VIEW pTabl
8350: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8360: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8370: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68  whenever any oth
8380: 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  er table or view
8390: 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a   is modified..**
83a0: 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64   The view passed
83b0: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
83c0: 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20  ne might depend 
83d0: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
83e0: 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65  rectly.** on the
83f0: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c   modified or del
8400: 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65  eted table so we
8410: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74   need to clear t
8420: 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a  he old column.**
8430: 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74   names so that t
8440: 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  hey will be reco
8450: 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
8460: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
8470: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
8480: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
8490: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
84a0: 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54   pTable==0 || pT
84b0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  able->pSelect==0
84c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
84d0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30   pTable->nCol==0
84e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
84f0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
8500: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8510: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8520: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
8530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8540: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
8550: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
8560: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
8570: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
8580: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
8590: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
85a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
85b0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
85c0: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
85d0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
85e0: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
85f0: 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69  ery VIEW..*/.voi
8600: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8610: 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29  tAll(sqlite *db)
8620: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8630: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
8640: 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72 65 73  s & SQLITE_Unres
8650: 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20 72 65  etViews)==0 ) re
8660: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
8670: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
8680: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  b->tblHash); i; 
8690: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
86a0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
86b0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
86c0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
86d0: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
86e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
86f0: 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  ViewResetColumnN
8700: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
8710: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
8720: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72  s &= ~SQLITE_Unr
8730: 65 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a  esetViews;.}../*
8740: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
8750: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
8760: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
8770: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
8780: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
8790: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
87a0: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
87b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
87c0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c  able *sqliteTabl
87d0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65  eFromToken(Parse
87e0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
87f0: 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a  *pTok){.  char *
8800: 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zName;.  Table *
8810: 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  pTab;.  zName = 
8820: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
8830: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a  romToken(pTok);.
8840: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8850: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
8860: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
8870: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
8880: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
8890: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
88a0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
88b0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
88c0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
88d0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
88e0: 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  ble: ", 0, .    
88f0: 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f      pTok->z, pTo
8900: 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  k->n, 0);.    pP
8910: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8920: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
8930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8940: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8950: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
8960: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
8970: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
8980: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
8990: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
89a0: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
89b0: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61  oid sqliteDropTa
89c0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
89d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
89e0: 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
89f0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
8a00: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
8a10: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a  base;.  sqlite *
8a20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8a30: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
8a40: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
8a50: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
8a60: 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20  eturn;.  pTable 
8a70: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f  = sqliteTableFro
8a80: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  mToken(pParse, p
8a90: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
8aa0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
8ab0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72  .  if( pTable->r
8ac0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
8ad0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
8ae0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8af0: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c   "table ", pTabl
8b00: 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  e->zName, .     
8b10: 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64    " may not be d
8b20: 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
8b30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
8b40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8b50: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
8b60: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b80: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
8b90: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73  se->zErrMsg, "us
8ba0: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
8bb0: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a  delete table ",.
8bc0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e        pTable->zN
8bd0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
8be0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
8bf0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8c00: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
8c10: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b  able->pSelect ){
8c20: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8c30: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8c40: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
8c50: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
8c60: 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54  view ",.      pT
8c70: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
8c80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8c90: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
8ca0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
8cb0: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
8cc0: 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
8cd0: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
8ce0: 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
8cf0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
8d00: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
8d10: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
8d20: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8d30: 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a  dropTable[] = {.
8d40: 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57        { OP_OpenW
8d50: 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20 20  rite,  0, 2,    
8d60: 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d      MASTER_NAME}
8d70: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  ,.      { OP_Rew
8d80: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
8d90: 28 39 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (9),  0},.      
8da0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
8db0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
8dc0: 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20  , /* 2 */.      
8dd0: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
8de0: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
8df0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
8e00: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
8e10: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 20 2a        0}, /* 4 *
8e20: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
8e30: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  umn,     0, 2,  
8e40: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
8e50: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
8e60: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d   0, ADDR(8),  0}
8e70: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
8e80: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
8e90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
8ea0: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
8eb0: 20 30 2c 20 41 44 44 52 28 34 29 2c 20 20 30 7d   0, ADDR(4),  0}
8ec0: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20  , /* 8 */.      
8ed0: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
8ee0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
8ef0: 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20  , /* 9 */.      
8f00: 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  { OP_SetCookie, 
8f10: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
8f20: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f  ,.      { OP_Clo
8f30: 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20  se,      0, 0,  
8f40: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
8f50: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
8f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  ;.    sqliteBegi
8f70: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
8f80: 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
8f90: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
8fa0: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
8fb0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
8fc0: 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a  eing dropped */.
8fd0: 20 20 20 20 77 68 69 6c 65 28 20 70 54 61 62 6c      while( pTabl
8fe0: 65 2d 3e 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e->pTrigger ){. 
8ff0: 20 20 20 20 20 54 6f 6b 65 6e 20 74 74 3b 0a 20       Token tt;. 
9000: 20 20 20 20 20 74 74 2e 7a 20 3d 20 70 54 61 62       tt.z = pTab
9010: 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61  le->pTrigger->na
9020: 6d 65 3b 0a 20 20 20 20 20 20 74 74 2e 6e 20 3d  me;.      tt.n =
9030: 20 73 74 72 6c 65 6e 28 70 54 61 62 6c 65 2d 3e   strlen(pTable->
9040: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b  pTrigger->name);
9050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f  .      sqliteDro
9060: 70 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  pTrigger(pParse,
9070: 20 26 74 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a   &tt, 1);.    }.
9080: 20 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d      if( !pTable-
9090: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  >isTemp ){.     
90a0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
90b0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
90c0: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
90d0: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
90e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
90f0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
9100: 65 2b 32 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e+2, pTable->zNa
9110: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  me, 0);.      sq
9120: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
9130: 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (db);.      sqli
9140: 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  teVdbeChangeP1(v
9150: 2c 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65  , base+9, db->ne
9160: 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  xt_cookie);.    
9170: 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  }.    if( !isVie
9180: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
9190: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
91a0: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65  _Destroy, pTable
91b0: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e  ->tnum, pTable->
91c0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  isTemp);.      f
91d0: 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e  or(pIdx=pTable->
91e0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
91f0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
9210: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
9220: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
9230: 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  um, pTable->isTe
9240: 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mp);.      }.   
9250: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64   }.    sqliteEnd
9260: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
9270: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
9280: 2a 20 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  * Move the table
9290: 20 28 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e   (and all its in
92a0: 64 69 63 65 73 29 20 74 6f 20 74 68 65 20 70 65  dices) to the pe
92b0: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
92c0: 2e 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ..  ** Or, if th
92d0: 65 20 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65  e table was neve
92e0: 72 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73  r committed, jus
92f0: 74 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66  t delete it.  If
9300: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
9310: 68 61 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  has been committ
9320: 65 64 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64  ed and is placed
9330: 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20   on the pending 
9340: 44 52 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e  DROP queue, then
9350: 20 74 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65   the.  ** delete
9360: 20 77 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e   will occur when
9370: 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74   sqliteCommitInt
9380: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65  ernalChanges() e
9390: 78 65 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  xecutes..  **.  
93a0: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66  ** Exception: if
93b0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
93c0: 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68  nt began with th
93d0: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
93e0: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20  d,.  ** then no 
93f0: 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62  changes should b
9400: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
9410: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
9420: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
9430: 65 50 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c  ePendingDropTabl
9440: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  e(db, pTable);. 
9450: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
9460: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
9470: 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nges;.  }.  sqli
9480: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
9490: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  b);.}../*.** Cre
94a0: 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
94b0: 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
94c0: 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65  .  pIndex is the
94d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
94e0: 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c  ex .** and pTabl
94f0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
9500: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9510: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
9520: 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
9530: 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
9540: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
9550: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
9560: 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
9570: 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
9580: 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
9590: 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
95a0: 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
95b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
95c0: 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
95d0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
95e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
95f0: 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
9600: 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
9610: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
9620: 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
9630: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9640: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
9650: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
9660: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
9670: 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
9680: 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
9690: 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
96a0: 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
96b0: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
96c0: 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
96d0: 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
96e0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
96f0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9700: 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
9710: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
9720: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9730: 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72  ,   /* All infor
9740: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
9750: 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
9760: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a  en *pName,    /*
9770: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
9780: 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ex.  May be NULL
9790: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
97a0: 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ble,   /* Name o
97b0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69  f the table to i
97c0: 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73  ndex.  Use pPars
97d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
97e0: 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  0 */.  IdList *p
97f0: 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
9800: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
9810: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
9820: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
9830: 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
9840: 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
9850: 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
9860: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
9870: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
9880: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
9890: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
98a0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
98b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
98c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
98d0: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
98e0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
98f0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
9900: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
9910: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
9920: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
9930: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
9940: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
9950: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
9960: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
9970: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
9980: 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
9990: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
99a0: 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
99b0: 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71   ID list */.  sq
99c0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
99d0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64  e->db;.  int hid
99e0: 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  eName = 0;      
99f0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74     /* Do not put
9a00: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
9a10: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  he hash table */
9a20: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
9a30: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
9a40: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
9a50: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
9a60: 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  index;..  /*.  *
9a70: 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
9a80: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
9a90: 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
9aa0: 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
9ab0: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
9ac0: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
9ad0: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30  assert( pName!=0
9ae0: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
9af0: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
9b00: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61  oken(pParse, pTa
9b10: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
9b20: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
9b30: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
9b40: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
9b50: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
9b60: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
9b70: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
9b80: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
9b90: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
9ba0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
9bb0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
9bc0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9bd0: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
9be0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20  zName, .      " 
9bf0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77  may not have new
9c00: 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c   indices added",
9c10: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
9c20: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
9c30: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9c40: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
9c50: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
9c60: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9c70: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9c80: 72 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79  rMsg, "views may
9c90: 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
9ca0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
9cb0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
9cc0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
9cd0: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
9ce0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
9cf0: 20 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72   created while r
9d00: 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63  e-reading the sc
9d10: 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65  hema from sqlite
9d20: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74  _master.  ** but
9d30: 20 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63   the table assoc
9d40: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
9d50: 69 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f  index is a tempo
9d60: 72 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63  rary table, it c
9d70: 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61  an.  ** only mea
9d80: 6e 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  n that the table
9d90: 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78   that this index
9da0: 20 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63   is really assoc
9db0: 69 61 74 65 64 20 77 69 74 68 20 69 73 0a 20 20  iated with is.  
9dc0: 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d  ** one whose nam
9dd0: 65 20 69 73 20 68 69 64 64 65 6e 20 62 65 68 69  e is hidden behi
9de0: 6e 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  nd a temporary t
9df0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
9e00: 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69  me name..  ** Si
9e10: 6e 63 65 20 69 74 73 20 74 61 62 6c 65 20 68 61  nce its table ha
9e20: 73 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65  s been suppresse
9e30: 64 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c  d, we need to al
9e40: 73 6f 20 73 75 70 70 72 65 73 73 20 74 68 65 0a  so suppress the.
9e50: 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f    ** index..  */
9e60: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
9e70: 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d  nitFlag && pTab-
9e80: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67  >isTemp ){.    g
9e90: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
9ea0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
9eb0: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
9ec0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
9ed0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
9ee0: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
9ef0: 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
9f00: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
9f10: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
9f20: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
9f30: 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
9f40: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9f50: 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
9f60: 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
9f70: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
9f80: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
9f90: 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
9fa0: 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
9fb0: 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
9fc0: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
9fd0: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
9fe0: 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
9ff0: 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
a000: 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
a010: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
a020: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
a030: 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
a040: 64 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c  dex, but we will
a050: 20 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20   not.  ** store 
a060: 69 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  its name in the 
a070: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74  hash table.  Set
a080: 20 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c   the hideName fl
a090: 61 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68  ag to accomplish
a0a0: 0a 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a  .  ** this..  **
a0b0: 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
a0c0: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
a0d0: 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
a0e0: 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
a0f0: 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
a100: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
a110: 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
a120: 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
a130: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
a140: 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ame ){.    Index
a150: 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pISameName;   
a160: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65   /* Another inde
a170: 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  x with the same 
a180: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c  name */.    Tabl
a190: 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20  e *pTSameName;  
a1a0: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74    /* A table wit
a1b0: 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  h same name as t
a1c0: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
a1d0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
a1e0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
a1f0: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  (pName);.    if(
a200: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
a210: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
a220: 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53  ex;.    if( (pIS
a230: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
a240: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
a250: 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
a260: 20 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65    if( pISameName
a270: 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  ->pTable->isTemp
a280: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
a290: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
a2a0: 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20  hideName = 1;.  
a2b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a2c0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
a2d0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
a2e0: 4d 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a  Msg, "index ", z
a2f0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Name, .         
a300: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
a310: 74 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ts", 0);.       
a320: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
a330: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
a340: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
a350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a360: 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61     if( (pTSameNa
a370: 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  me = sqliteFindT
a380: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29  able(db, zName))
a390: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
a3a0: 20 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54   pTSameName->isT
a3b0: 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69  emp && pParse->i
a3c0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  nitFlag ){.     
a3d0: 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b     hideName = 1;
a3e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
a400: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
a410: 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69  ErrMsg, "there i
a420: 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
a430: 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20  e named ",.     
a440: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b        zName, 0);
a450: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
a460: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
a470: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
a480: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
a490: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a4a0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
a4b0: 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
a4c0: 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
a4d0: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
a4e0: 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
a4f0: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
a500: 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
a510: 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
a520: 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20  Buf,"%d)",n);.  
a530: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
a540: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
a550: 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54  (&zName, "(", pT
a560: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74  ab->zName, " aut
a570: 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20  oindex ", zBuf, 
a580: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
a590: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
a5a0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
a5b0: 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71     hideName = sq
a5c0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
a5d0: 2c 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d  , zName)!=0;.  }
a5e0: 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
a5f0: 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
a600: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
a610: 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
a620: 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
a630: 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
a640: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
a650: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
a660: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
a670: 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
a680: 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
a690: 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
a6a0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
a6b0: 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
a6c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
a6d0: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
a6e0: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
a6f0: 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29  strlen(nullId.z)
a700: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
a710: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
a720: 28 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20  (0, &nullId);.  
a730: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
a740: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
a750: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
a760: 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
a770: 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
a780: 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70  cture. .  */.  p
a790: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61  Index = sqliteMa
a7a0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64  lloc( sizeof(Ind
a7b0: 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61  ex) + strlen(zNa
a7c0: 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20  me) + 1 +.      
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c    sizeof(int)*pL
a7f0: 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66  ist->nId );.  if
a800: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f  ( pIndex==0 ) go
a810: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
a820: 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
a830: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
a840: 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70  )&pIndex[1];.  p
a850: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
a860: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
a870: 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e  iColumn[pList->n
a880: 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49  Id];.  strcpy(pI
a890: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
a8a0: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  me);.  pIndex->p
a8b0: 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
a8c0: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
a8d0: 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20  = pList->nId;.  
a8e0: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
a8f0: 3d 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71  = pIndex->isUniq
a900: 75 65 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20  ue = onError;.. 
a910: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
a920: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
a930: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
a940: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
a950: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
a960: 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
a970: 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
a980: 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
a990: 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
a9a0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
a9b0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
a9c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
a9d0: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
a9e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
a9f0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
aa00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
aa10: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
aa20: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
aa30: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
aa40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
aa50: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
aa60: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
aa70: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
aa80: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
aa90: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
aaa0: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
aab0: 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d    " has no colum
aac0: 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74  n named ", pList
aad0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29  ->a[i].zName, 0)
aae0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
aaf0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nErr++;.      sq
ab00: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
ab10: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
ab20: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ab30: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
ab40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
ab50: 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  j;.  }..  /* Lin
ab60: 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
ab70: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
ab80: 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
ab90: 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
aba0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
abb0: 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
abc0: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
abd0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64  >explain && !hid
abe0: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64  eName ){.    Ind
abf0: 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
ac00: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
ac10: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49  &db->idxHash, pI
ac20: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
ac30: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  len(zName)+1, pI
ac40: 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
ac50: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ac60: 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
ac70: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
ac80: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
ac90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
aca0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
acb0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
acc0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
acd0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
ace0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
acf0: 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  s;.  }..  /* Whe
ad00: 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
ad10: 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
ad20: 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
ad30: 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
ad40: 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
ad50: 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
ad60: 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
ad70: 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
ad80: 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
ad90: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
ada0: 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
adb0: 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
adc0: 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
add0: 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
ade0: 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
adf0: 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
ae00: 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
ae10: 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
ae20: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
ae30: 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e  eplace){.    pIn
ae40: 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
ae50: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  b->pIndex;.    p
ae60: 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
ae70: 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
ae80: 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
ae90: 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
aea0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68  .    while( pOth
aeb0: 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
aec0: 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
aed0: 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
aee0: 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20  ){.      pOther 
aef0: 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
af00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
af10: 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
af20: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f  r->pNext;.    pO
af30: 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
af40: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
af50: 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20  If the initFlag 
af60: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
af70: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
af80: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
af90: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
afa0: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
afb0: 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  isk.  So do not 
afc0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
afd0: 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45  k.  ** again.  E
afe0: 78 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65  xtract the table
aff0: 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65   number from the
b000: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
b010: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69   field..  */.  i
b020: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
b030: 6c 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30  lag && pTable!=0
b040: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
b050: 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tnum = pParse->n
b060: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
b070: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61  * If the initFla
b080: 67 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  g is 0 then crea
b090: 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
b0a0: 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
b0b0: 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
b0c0: 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
b0d0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
b0e0: 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
b0f0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
b100: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
b110: 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
b120: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
b130: 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65  nitFlag is 0 whe
b140: 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
b150: 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
b160: 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
b170: 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46  mand.  The initF
b180: 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20  lag is 1 when a 
b190: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
b1a0: 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
b1b0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
b1c0: 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
b1d0: 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
b1e0: 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
b1f0: 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
b200: 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
b210: 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
b220: 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
b230: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
b240: 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
b250: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
b260: 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e  Table==0 it mean
b270: 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
b280: 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
b290: 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
b2a0: 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
b2b0: 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
b2c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b2d0: 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
b2e0: 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
b2f0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
b300: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
b310: 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
b320: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
b330: 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
b340: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
b350: 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65   else if( pParse
b360: 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b  ->initFlag==0 ){
b370: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
b380: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74  Vdbe *v;.    int
b390: 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20   lbl1, lbl2;.   
b3a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
b3b0: 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73  addr;.    int is
b3c0: 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54  Temp = pTab->isT
b3d0: 65 6d 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  emp;..    v = sq
b3e0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
b3f0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b400: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
b410: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
b420: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
b430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
b440: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
b450: 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
b460: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
b470: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b490: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32 29  OpenWrite, 0, 2)
b4a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b4b0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
b4c0: 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  -1, MASTER_NAME,
b4d0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
b4e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b4f0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
b500: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b510: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
b520: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  no, 0, 0);.     
b530: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b540: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
b550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b560: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b570: 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20 50  , -1, "index", P
b580: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
b590: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b5a0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
b5b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b5c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b5d0: 2c 20 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  , -1, pIndex->zN
b5e0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
b5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b600: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
b610: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
b620: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
b630: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
b640: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
b650: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  IC);.    }.    a
b660: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
b670: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
b680: 74 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65  teIndex, 0, isTe
b690: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  mp);.    sqliteV
b6a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
b6b0: 64 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e  ddr, (char*)&pIn
b6c0: 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f  dex->tnum, P3_PO
b6d0: 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64  INTER);.    pInd
b6e0: 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  ex->tnum = 0;.  
b6f0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
b700: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
b710: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b720: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b730: 50 5f 4f 70 65 6e 57 72 41 75 78 2c 20 31 2c 20  P_OpenWrAux, 1, 
b740: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
b750: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
b770: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
b780: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b790: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
b7a0: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
b7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b7c0: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
b7d0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
b7e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
b7f0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
b800: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
b810: 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
b820: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
b830: 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74 61 72  >z) - Addr(pStar
b840: 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  t->z) + 1;.     
b850: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b860: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
b870: 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  Start->z, n);.  
b880: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b890: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b8a0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
b8b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b8c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b8d0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
b8e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
b8f0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
b900: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b910: 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f 50 5f  (v, isTemp ? OP_
b920: 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65  OpenAux : OP_Ope
b930: 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  n, 2, pTab->tnum
b940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b950: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
b960: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
b970: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
b980: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
b990: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b9a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b9b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
b9c0: 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
b9d0: 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
b9e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b9f0: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
ba00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ba10: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
ba20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ba30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ba40: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
ba50: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
ba60: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
ba70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ba80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
ba90: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
baa0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
bab0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bac0: 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  p(v, OP_IdxPut, 
bad0: 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  1, pIndex->onErr
bae0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20  or!=OE_None);.  
baf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
bb00: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
bb10: 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  2, lbl1);.      
bb20: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
bb30: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b  eLabel(v, lbl2);
bb40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
bb50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
bb60: 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  se, 2, 0);.     
bb70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
bb80: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
bb90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
bba0: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
bbb0: 20 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d        if( !isTem
bbc0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
bbd0: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
bbe0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
bbf0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bc00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
bc10: 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  next_cookie, 0);
bc20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
bc30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
bc40: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b  etCookie, 0, 0);
bc50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
bc60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
bc70: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
bc80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
bc90: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
bca0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
bcb0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
bcc0: 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
bcd0: 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
bce0: 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  te_index:.  sqli
bcf0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
bd00: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  List);.  sqliteF
bd10: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
bd20: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
bd30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
bd40: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
bd50: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
bd60: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
bd70: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
bd80: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
bd90: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
bda0: 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72  iteDropIndex(Par
bdb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
bdc0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  n *pName){.  Ind
bdd0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68  ex *pIndex;.  ch
bde0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62  ar *zName;.  Vdb
bdf0: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
be00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
be10: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
be20: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
be30: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
be40: 65 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d  eturn;.  zName =
be50: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
be60: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
be70: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
be80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
be90: 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  dex = sqliteFind
bea0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
beb0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
bec0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  Name);.  if( pIn
bed0: 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
bee0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
bef0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
bf00: 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
bf10: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
bf20: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
bf30: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
bf40: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
bf50: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
bf60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bf70: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
bf80: 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
bf90: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
bfa0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
bfb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bfc0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
bfd0: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49  tic VdbeOp dropI
bfe0: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
bff0: 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c   { OP_OpenWrite,
c000: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 4d 41    0, 2,       MA
c010: 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20  STER_NAME},.    
c020: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
c030: 20 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c 30     0, ADDR(10),0
c040: 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
c050: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
c060: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20         0}, /* 2 
c070: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
c080: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
c090: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
c0a0: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
c0b0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   1, 0,       0},
c0c0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 4 */.      {
c0d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
c0e0: 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 1,       0},.
c0f0: 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20        { OP_Eq,  
c100: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
c110: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
c120: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
c130: 20 41 44 44 52 28 34 29 2c 20 30 7d 2c 0a 20 20   ADDR(4), 0},.  
c140: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
c150: 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 30 29       0, ADDR(10)
c160: 2c 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  ,0},.      { OP_
c170: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
c180: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39  ,       0}, /* 9
c190: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
c1a0: 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30 2c  nteger,    0, 0,
c1b0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 30         0}, /* 10
c1c0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
c1d0: 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c  etCookie,  0, 0,
c1e0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
c1f0: 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20   { OP_Close,    
c200: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
c210: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
c220: 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c 65   base;.    Table
c230: 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
c240: 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73 71  >pTable;..    sq
c250: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
c260: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
c270: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  0);.    if( !pTa
c280: 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  b->isTemp ){.   
c290: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
c2a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
c2b0: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
c2c0: 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
c2d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c2e0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
c2f0: 61 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+2, pIndex->z
c300: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
c310: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  ;.      sqliteCh
c320: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
c330: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c340: 43 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65  ChangeP1(v, base
c350: 2b 31 30 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  +10, db->next_co
c360: 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  okie);.    }.   
c370: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c380: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
c390: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 54  pIndex->tnum, pT
c3a0: 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20  ab->isTemp);.   
c3b0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
c3c0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
c3d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
c3e0: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 74 6f 20   the index onto 
c3f0: 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50  the pending DROP
c400: 20 71 75 65 75 65 2e 20 20 4f 72 2c 20 69 66 20   queue.  Or, if 
c410: 74 68 65 20 69 6e 64 65 78 20 77 61 73 0a 20 20  the index was.  
c420: 2a 2a 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74  ** never committ
c430: 65 64 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20  ed, just delete 
c440: 69 74 2e 20 20 49 6e 64 69 63 65 73 20 6f 6e 20  it.  Indices on 
c450: 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50  the pending DROP
c460: 20 71 75 65 75 65 0a 20 20 2a 2a 20 67 65 74 20   queue.  ** get 
c470: 64 65 6c 65 74 65 64 20 62 79 20 73 71 6c 69 74  deleted by sqlit
c480: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
c490: 68 61 6e 67 65 73 28 29 20 77 68 65 6e 20 74 68  hanges() when th
c4a0: 65 20 75 73 65 72 20 65 78 65 63 75 74 65 73 0a  e user executes.
c4b0: 20 20 2a 2a 20 61 20 43 4f 4d 4d 49 54 2e 20 20    ** a COMMIT.  
c4c0: 4f 72 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  Or if a rollback
c4d0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6c 65   occurs, the ele
c4e0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 44 52 4f  ments of the DRO
c4f0: 50 20 71 75 65 75 65 0a 20 20 2a 2a 20 61 72 65  P queue.  ** are
c500: 20 6d 6f 76 65 64 20 62 61 63 6b 20 69 6e 74 6f   moved back into
c510: 20 74 68 65 20 6d 61 69 6e 20 68 61 73 68 20 74   the main hash t
c520: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
c530: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
c540: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 50  n ){.    sqliteP
c550: 65 6e 64 69 6e 67 44 72 6f 70 49 6e 64 65 78 28  endingDropIndex(
c560: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  db, pIndex);.   
c570: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
c580: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
c590: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
c5a0: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
c5b0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
c5c0: 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
c5d0: 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
c5e0: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
c5f0: 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
c600: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
c610: 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
c620: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
c630: 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73  ist *sqliteIdLis
c640: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
c650: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
c660: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
c670: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
c680: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
c690: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
c6a0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
c6b0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
c6c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69  ;.  }.  if( (pLi
c6d0: 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20  st->nId & 7)==0 
c6e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
c6f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
c700: 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
c710: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70  loc(pList->a, (p
c720: 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a  List->nId+8)*siz
c730: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c740: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
c750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c760: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
c770: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
c780: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
c790: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c7a0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
c7b0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
c7c0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
c7d0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
c7e0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
c7f0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
c800: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
c810: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
c820: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
c830: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
c840: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  n->n, 0);.    if
c850: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
c860: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
c870: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
c880: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
c8a0: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
c8b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c  ;.    }.  }.  pL
c8c0: 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
c8d0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
c8e0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
c8f0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
c900: 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
c910: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
c920: 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
c930: 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
c940: 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
c950: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
c960: 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
c970: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
c980: 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
c990: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
c9a0: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
c9b0: 73 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  s..*/.SrcList *s
c9c0: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
c9d0: 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
c9e0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
c9f0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
ca00: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
ca10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
ca20: 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
ca30: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
ca40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ca50: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
ca60: 6e 53 72 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a  nSrc & 7)==0 ){.
ca70: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
ca80: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
ca90: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
caa0: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69  c(pList->a, (pLi
cab0: 73 74 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65  st->nSrc+8)*size
cac0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
cad0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
cae0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
caf0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
cb00: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
cb10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
cb20: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
cb30: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
cb40: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
cb50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
cb60: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
cb70: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63   pToken ){.    c
cb80: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73  har **pz = &pLis
cb90: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
cba0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  ].zName;.    sql
cbb0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
cbc0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
cbd0: 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ken->n, 0);.    
cbe0: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
cbf0: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
cc00: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
cc10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cc20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc30: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
cc40: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
cc50: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
cc60: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
cc70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
cc80: 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
cc90: 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
cca0: 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
ccb0: 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
ccc0: 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74  id sqliteSrcList
ccd0: 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
cce0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
ccf0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
cd00: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
cd10: 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Src>0 ){.    int
cd20: 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63   i = pList->nSrc
cd30: 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   - 1;.    sqlite
cd40: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
cd50: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
cd60: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
cd70: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
cd80: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
cd90: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
cda0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
cdb0: 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
cdc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64  */.void sqliteId
cdd0: 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73  ListDelete(IdLis
cde0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
cdf0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
ce00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
ce10: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
ce20: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ce30: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
ce40: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
ce50: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
ce60: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
ce70: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
ce80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ce90: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
cea0: 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
ceb0: 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
cec0: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
ced0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
cee0: 6e 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49  nt sqliteIdListI
cef0: 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
cf00: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
cf10: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
cf20: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
cf30: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
cf40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
cf50: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
cf60: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
cf70: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
cf80: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
cf90: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
cfa0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
cfb0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
cfc0: 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
cfd0: 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
cfe0: 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
cff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c  .void sqliteSrcL
d000: 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73  istDelete(SrcLis
d010: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
d020: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
d030: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
d040: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
d050: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
d060: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
d070: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
d080: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
d090: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
d0a0: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  s);.    if( pLis
d0b0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20  t->a[i].pTab && 
d0c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
d0d0: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
d0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
d0f0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73  eteTable(0, pLis
d100: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20  t->a[i].pTab);. 
d110: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53     }.    sqliteS
d120: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73  electDelete(pLis
d130: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  t->a[i].pSelect)
d140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72  ;.    sqliteExpr
d150: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
d160: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  i].pOn);.    sql
d170: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
d180: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69  pList->a[i].pUsi
d190: 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
d1a0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
d1b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
d1c0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
d1d0: 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20  he COPY command 
d1e0: 69 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  is for compatibi
d1f0: 6c 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72  lity with Postgr
d200: 65 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69  eSQL and specifi
d210: 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68  cially.** for th
d220: 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61  e ability to rea
d230: 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  d the output of 
d240: 70 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f  pg_dump.  The fo
d250: 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f  rmat is as.** fo
d260: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
d270: 43 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20  COPY table FROM 
d280: 66 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49  file [USING DELI
d290: 4d 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a  MITERS string].*
d2a0: 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20  *.** "table" is 
d2b0: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
d2c0: 65 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c  e name.  We will
d2d0: 20 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63   read lines of c
d2e0: 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65  ode from.** file
d2f0: 20 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61   to fill this ta
d300: 62 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20  ble with data.  
d310: 46 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73  File might be "s
d320: 74 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69  tdin".  The opti
d330: 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65  onal.** delimite
d340: 72 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66  r string identif
d350: 69 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65  ies the field se
d360: 70 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64  parators.  The d
d370: 65 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e  efault is a tab.
d380: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
d390: 6f 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  opy(.  Parse *pP
d3a0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
d3b0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
d3c0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
d3d0: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54  ableName,   /* T
d3e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
d3f0: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
d400: 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a  we will insert *
d410: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65  /.  Token *pFile
d420: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  name,    /* The 
d430: 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  file from which 
d440: 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d  to obtain inform
d450: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ation */.  Token
d460: 20 2a 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20   *pDelimiter,   
d470: 2f 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74  /* Use this as t
d480: 68 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74  he field delimit
d490: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  er */.  int onEr
d4a0: 72 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ror          /* 
d4b0: 57 68 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20  What to do if a 
d4c0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73  constraint fails
d4d0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
d4e0: 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54  pTab;.  char *zT
d4f0: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  ab;.  int i;.  V
d500: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64  dbe *v;.  int ad
d510: 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78  dr, end;.  Index
d520: 20 2a 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65   *pIdx;.  sqlite
d530: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d540: 62 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c  b;..  zTab = sql
d550: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
d560: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65  Token(pTableName
d570: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  );.  if( sqlite_
d580: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c  malloc_failed ||
d590: 20 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   zTab==0 ) goto 
d5a0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
d5b0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62  pTab = sqliteTab
d5c0: 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50  leNameToTable(pP
d5d0: 61 72 73 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73  arse, zTab);.  s
d5e0: 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b  qliteFree(zTab);
d5f0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
d600: 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e   goto copy_clean
d610: 75 70 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  up;.  v = sqlite
d620: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d630: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
d640: 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20  int openOp;.    
d650: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
d660: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
d670: 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  , 1);.    addr =
d680: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d690: 28 76 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c  (v, OP_FileOpen,
d6a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
d6b0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
d6c0: 2c 20 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d  , addr, pFilenam
d6d0: 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  e->z, pFilename-
d6e0: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  >n);.    sqliteV
d6f0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
d700: 61 64 64 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f  addr);.    openO
d710: 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70  p = pTab->isTemp
d720: 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20   ? OP_OpenWrAux 
d730: 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  : OP_OpenWrite;.
d740: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d750: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30  dOp(v, openOp, 0
d760: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
d770: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d780: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
d790: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
d7a0: 54 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  TIC);.    for(i=
d7b0: 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  1, pIdx=pTab->pI
d7c0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d7d0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
d7e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
d7f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
d800: 6e 4f 70 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e  nOp, i, pIdx->tn
d810: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
d820: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d830: 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
d840: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d850: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
d860: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
d870: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
d880: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d890: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
d8a0: 20 30 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74   0, 0);  /* Init
d8b0: 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 20 63  ialize the row c
d8c0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ount */.    }.  
d8d0: 20 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64    end = sqliteVd
d8e0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
d8f0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d900: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d910: 5f 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d  _FileRead, pTab-
d920: 3e 6e 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20  >nCol, end);.   
d930: 20 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20   if( pDelimiter 
d940: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
d950: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
d960: 64 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d  ddr, pDelimiter-
d970: 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e  >z, pDelimiter->
d980: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
d990: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
d9a0: 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73   addr);.    }els
d9b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e{.      sqliteV
d9c0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
d9d0: 64 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20  ddr, "\t", 1);. 
d9e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
d9f0: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
da00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
da10: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43  ddOp(v, OP_FileC
da20: 6f 6c 75 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b  olumn, pTab->iPK
da30: 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ey, 0);.      sq
da40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
da50: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30   OP_MustBeInt, 0
da60: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
da70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
da80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
da90: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
daa0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
dab0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
dac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
dad0: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
dae0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
daf0: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
db00: 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69  key column is fi
db10: 6c 6c 65 64 20 77 69 74 68 20 4e 55 4c 4c 20 73  lled with NULL s
db20: 69 6e 63 65 20 69 74 73 0a 20 20 20 20 20 20 20  ince its.       
db30: 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 61 6c 77   ** value is alw
db40: 61 79 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20  ays pulled from 
db50: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
db60: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
db70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
db80: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
db90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
dbb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
dbc0: 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a  eColumn, i, 0);.
dbd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dbe0: 20 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65    sqliteGenerate
dbf0: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
dc00: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
dc10: 2c 20 30 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72  , 0, 0, 0, onErr
dc20: 6f 72 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73  or, addr);.    s
dc30: 71 6c 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73  qliteCompleteIns
dc40: 65 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  ertion(pParse, p
dc50: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  Tab, 0, 0, 0, 0)
dc60: 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66  ;.    if( (db->f
dc70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
dc80: 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20  untRows)!=0 ){. 
dc90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
dca0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
dcb0: 6d 2c 20 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e  m, 1, 0);  /* In
dcc0: 63 72 65 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e  crement row coun
dcd0: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  t */.    }.    s
dce0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dcf0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
dd00: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dr);.    sqliteV
dd10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dd20: 76 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c  v, end);.    sql
dd30: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
dd40: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
dd50: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
dd60: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
dd70: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  se);.    if( db-
dd80: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
dd90: 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20  CountRows ){.   
dda0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ddb0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43  Op(v, OP_ColumnC
ddc0: 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  ount, 1, 0);.   
ddd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
dde0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
ddf0: 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ame, 0, 0);.    
de00: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
de10: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77  geP3(v, -1, "row
de20: 73 20 69 6e 73 65 72 74 65 64 22 2c 20 50 33 5f  s inserted", P3_
de30: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
de40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
de50: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31  , OP_Callback, 1
de60: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
de70: 20 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a    .copy_cleanup:
de80: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
de90: 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e  .** The non-stan
dea0: 64 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d  dard VACUUM comm
deb0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63  and is used to c
dec0: 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61  lean up the data
ded0: 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73  base,.** collaps
dee0: 65 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74  e free space, et
def0: 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c  c.  It is modell
df00: 65 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43  ed after the VAC
df10: 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69  UUM command.** i
df20: 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a  n PostgreSQL..**
df30: 0a 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31  .** In version 1
df40: 2e 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20  .0.x of SQLite, 
df50: 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  the VACUUM comma
df60: 6e 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a  nd would call.**
df70: 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65   gdbm_reorganize
df80: 28 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61  () on all the da
df90: 74 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20  tabase tables.  
dfa0: 42 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  But beginning.**
dfb0: 20 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c   with 2.0.0, SQL
dfc0: 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73  ite no longer us
dfd0: 65 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20  es GDBM so this 
dfe0: 63 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62  command has.** b
dff0: 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ecome a no-op..*
e000: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63  /.void sqliteVac
e010: 75 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73  uum(Parse *pPars
e020: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  e, Token *pTable
e030: 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e  Name){.  /* Do n
e040: 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  othing */.}../*.
e050: 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
e060: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
e070: 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61  qliteBeginTransa
e080: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
e090: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
e0a0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
e0b0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
e0c0: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
e0d0: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  >db)==0 || db->p
e0e0: 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Be==0 ) return;.
e0f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
e100: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
e110: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
e120: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
e130: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
e140: 54 72 61 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a  Trans ) return;.
e150: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
e160: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e170: 73 65 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c  se, 0);.  db->fl
e180: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
e190: 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45  Trans;.  db->onE
e1a0: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
e1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
e1c0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
e1d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
e1e0: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
e1f0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
e200: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
e210: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
e220: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
e230: 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30  =0 || db->pBe==0
e240: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
e250: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
e260: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
e270: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e280: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
e290: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
e2a0: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
e2b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
e2c0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
e2d0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
e2e0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
e2f0: 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  );.  db->onError
e300: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d   = OE_Default;.}
e310: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
e320: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
e330: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c  /.void sqliteRol
e340: 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
e350: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
e360: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
e370: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
e380: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
e390: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
e3a0: 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29   || db->pBe==0 )
e3b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e3c0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
e3d0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
e3e0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
e3f0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
e400: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
e410: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e420: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
e430: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
e440: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
e450: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e460: 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b  Rollback, 0, 0);
e470: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
e480: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
e490: 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72  ans;.  db->onErr
e4a0: 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b  or = OE_Default;
e4b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e4c0: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
e4d0: 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
e4e0: 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
e4f0: 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
e500: 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
e510: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
e520: 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
e530: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
e540: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
e550: 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
e560: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
e570: 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
e580: 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
e590: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
e5a0: 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
e5b0: 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 43   set if the setC
e5c0: 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65  heckpoint parame
e5d0: 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
e5e0: 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
e5f0: 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
e600: 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
e610: 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
e620: 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
e630: 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
e640: 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
e650: 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
e660: 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
e670: 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
e680: 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
e690: 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
e6a0: 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
e6b0: 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
e6c0: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
e6d0: 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
e6e0: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
e6f0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
e700: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
e710: 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
e720: 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
e730: 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
e740: 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
e750: 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a   not be set..*/.
e760: 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e  void sqliteBegin
e770: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
e780: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e790: 74 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 29  t setCheckpoint)
e7a0: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
e7b0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
e7c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e7d0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e7e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69   if( pParse->tri
e7f0: 67 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b  gStack ) return;
e800: 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69   /* if this is i
e810: 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  n a trigger */. 
e820: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
e830: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e840: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
e850: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e860: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
e870: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
e880: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e890: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
e8a0: 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62  okie, pParse->db
e8b0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
e8c0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
e8d0: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
e8e0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
e8f0: 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29   setCheckpoint )
e900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
e910: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63  AddOp(v, OP_Chec
e920: 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  kpoint, 0, 0);. 
e930: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
e940: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
e950: 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72  oncludes an oper
e960: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68  ation that may h
e970: 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74  ave changed.** t
e980: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
e990: 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f  is is a companio
e9a0: 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65  n function to Be
e9b0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
e9c0: 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61  n()..** If a tra
e9d0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
e9e0: 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  rted, then commi
e9f0: 74 20 69 74 2e 20 20 49 66 20 61 20 63 68 65 63  t it.  If a chec
ea00: 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74  kpoint was.** st
ea10: 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69  arted then commi
ea20: 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  t that..*/.void 
ea30: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
ea40: 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
ea50: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
ea60: 76 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  v;.  if( pParse-
ea70: 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74  >trigStack ) ret
ea80: 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20  urn; /* if this 
ea90: 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20  is in a trigger 
eaa0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
eab0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
eac0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
ead0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
eae0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
eaf0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
eb00: 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69  .    /* Do Nothi
eb10: 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ng */.  }else{. 
eb20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
eb30: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
eb40: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a   0, 0);.  }.}...
eb50: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
eb60: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
eb70: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
eb80: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
eb90: 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68  nt getBoolean(ch
eba0: 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63  ar *z){.  static
ebb0: 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20   char *azTrue[] 
ebc0: 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c  = { "yes", "on",
ebd0: 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74   "true" };.  int
ebe0: 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d   i;.  if( z[0]==
ebf0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ec00: 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d  if( isdigit(z[0]
ec10: 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20  ) || (z[0]=='-' 
ec20: 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29  && isdigit(z[1])
ec30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ec40: 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66  atoi(z);.  }.  f
ec50: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
ec60: 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28  (azTrue)/sizeof(
ec70: 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29  azTrue[0]); i++)
ec80: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
ec90: 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65  StrICmp(z,azTrue
eca0: 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  [i])==0 ) return
ecb0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
ecc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f   0;.}../*.** Pro
ecd0: 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73 74  cess a pragma st
ece0: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
ecf0: 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20   Pragmas are of 
ed00: 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  this form:.**.**
ed10: 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64 20        PRAGMA id 
ed20: 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68  = value.**.** Th
ed30: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67  e identifier mig
ed40: 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72  ht also be a str
ed50: 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ing.  The value 
ed60: 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64  is a string, and
ed70: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20  .** identifier, 
ed80: 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  or a number.  If
ed90: 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72   minusFlag is tr
eda0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ue, then the val
edb0: 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65  ue is.** a numbe
edc0: 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65  r that was prece
edd0: 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73  ded by a minus s
ede0: 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ign..*/.void sql
edf0: 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65 20  itePragma(Parse 
ee00: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
ee10: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
ee20: 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46  ight, int minusF
ee30: 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  lag){.  char *zL
ee40: 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  eft = 0;.  char 
ee50: 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73  *zRight = 0;.  s
ee60: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
ee70: 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74  se->db;..  zLeft
ee80: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
ee90: 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74  (pLeft->z, pLeft
eea0: 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65  ->n);.  sqliteDe
eeb0: 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20  quote(zLeft);.  
eec0: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
eed0: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b  .    zRight = 0;
eee0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
eef0: 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22  tring(&zRight, "
ef00: 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a  -", 1, pRight->z
ef10: 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b  , pRight->n, 0);
ef20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
ef30: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72  ight = sqliteStr
ef40: 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20  NDup(pRight->z, 
ef50: 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20  pRight->n);.    
ef60: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52  sqliteDequote(zR
ef70: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f  ight);.  }. .  /
ef80: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64  *.  **  PRAGMA d
ef90: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
efa0: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64  e.  **  PRAGMA d
efb0: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
efc0: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
efd0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
efe0: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
eff0: 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74   persistent sett
f000: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
f010: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
f020: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
f030: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
f040: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
f050: 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
f060: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
f070: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
f080: 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72  ts both the curr
f090: 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  ent.  ** page ca
f0a0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61  che size value a
f0b0: 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  nd the persisten
f0c0: 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  t page cache siz
f0d0: 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f  e value.  ** sto
f0e0: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
f0f0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  ase file..  **. 
f100: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
f110: 63 61 63 68 65 20 73 69 7a 65 20 69 73 20 73 74  cache size is st
f120: 6f 72 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c  ored in meta-val
f130: 75 65 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f  ue 2 of page 1 o
f140: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
f150: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63  ase file.  The c
f160: 61 63 68 65 20 73 69 7a 65 20 69 73 20 61 63 74  ache size is act
f170: 75 61 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75  ually the absolu
f180: 74 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a  te value of.  **
f190: 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63   this memory loc
f1a0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e  ation.  The sign
f1b0: 20 6f 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32   of meta-value 2
f1c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a   determines the.
f1d0: 20 20 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73    ** synchronous
f1e0: 20 73 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67   setting.  A neg
f1f0: 61 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e  ative value mean
f200: 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  s synchronous is
f210: 20 6f 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20   off.  ** and a 
f220: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d  positive value m
f230: 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  eans synchronous
f240: 20 69 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69   is on..  */.  i
f250: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
f260: 28 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f  (zLeft,"default_
f270: 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20  cache_size")==0 
f280: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
f290: 62 65 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a  beOp getCacheSiz
f2a0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
f2b0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
f2c0: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
f2d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 62 73 56  .      { OP_AbsV
f2e0: 61 6c 75 65 2c 20 20 20 20 30 2c 20 30 2c 20 20  alue,    0, 0,  
f2f0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
f300: 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20  { OP_Dup,       
f310: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
f320: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
f330: 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c  teger,     0, 0,
f340: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
f350: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
f360: 20 20 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20      0, 6,       
f370: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
f380: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 4d 41 58  Integer,     MAX
f390: 5f 50 41 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20  _PAGES,0, 0},.  
f3a0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
f3b0: 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
f3c0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
f3d0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
f3e0: 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63 61 63  , 0,        "cac
f3f0: 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20  he_size"},.     
f400: 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
f410: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
f420: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56  0},.    };.    V
f430: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
f440: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f450: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
f460: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
f470: 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d  Right->z==pLeft-
f480: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
f490: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
f4a0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74  v, ArraySize(get
f4b0: 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43  CacheSize), getC
f4c0: 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  acheSize);.    }
f4d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
f4e0: 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
f4f0: 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67  size = atoi(zRig
f500: 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ht);.      if( s
f510: 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
f520: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
f530: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
f540: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29  ation(pParse, 0)
f550: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
f560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f570: 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b  teger, size, 0);
f580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f590: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61  eAddOp(v, OP_Rea
f5a0: 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  dCookie, 0, 2);.
f5b0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
f5c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f5d0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
f5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f5f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
f600: 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20  e, 0, addr+3);. 
f610: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f620: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
f630: 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
f640: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f650: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
f660: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
f670: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
f680: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
f690: 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
f6a0: 5f 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68  _size = db->cach
f6b0: 65 5f 73 69 7a 65 3c 30 20 3f 20 2d 73 69 7a 65  e_size<0 ? -size
f6c0: 20 3a 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73   : size;.      s
f6d0: 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63  qliteBtreeSetCac
f6e0: 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20  heSize(db->pBe, 
f6f0: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  db->cache_size);
f700: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
f710: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
f720: 41 20 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  A cache_size.  *
f730: 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  *  PRAGMA cache_
f740: 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
f750: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
f760: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
f770: 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  ent local settin
f780: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
f790: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
f7a0: 20 54 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69   The local setti
f7b0: 6e 67 20 63 61 6e 20 62 65 20 64 69 66 66 65 72  ng can be differ
f7c0: 65 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ent from.  ** th
f7d0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 63 61 63  e persistent cac
f7e0: 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 74 68  he size value th
f7f0: 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  at is stored in 
f800: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
f810: 2a 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 20  * file itself.  
f820: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
f830: 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ed is the maximu
f840: 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  m number of.  **
f850: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
f860: 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73  ge cache.  The s
f870: 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20  econd form sets 
f880: 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70  the local.  ** p
f890: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76  age cache size v
f8a0: 61 6c 75 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  alue.  It does n
f8b0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 65  ot change the pe
f8c0: 72 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61  rsistent.  ** ca
f8d0: 63 68 65 20 73 69 7a 65 20 73 74 6f 72 65 64 20  che size stored 
f8e0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 73 6f 20 74  on the disk so t
f8f0: 68 65 20 63 61 63 68 65 20 73 69 7a 65 20 77 69  he cache size wi
f900: 6c 6c 20 72 65 76 65 72 74 0a 20 20 2a 2a 20 74  ll revert.  ** t
f910: 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61  o its default va
f920: 6c 75 65 20 77 68 65 6e 20 74 68 65 20 64 61 74  lue when the dat
f930: 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 20  abase is closed 
f940: 61 6e 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20  and reopened..  
f950: 2a 2a 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 61  ** N should be a
f960: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
f970: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  r..  */.  if( sq
f980: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
f990: 74 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d  t,"cache_size")=
f9a0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
f9b0: 20 56 64 62 65 4f 70 20 67 65 74 43 61 63 68 65   VdbeOp getCache
f9c0: 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Size[] = {.     
f9d0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
f9e0: 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
f9f0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
fa00: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
fa10: 2c 20 20 20 20 20 20 20 20 22 63 61 63 68 65 5f  ,        "cache_
fa20: 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20  size"},.      { 
fa30: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
fa40: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
fa50: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65  .    };.    Vdbe
fa60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   *v = sqliteGetV
fa70: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
fa80: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
fa90: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67  rn;.    if( pRig
faa0: 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
fab0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
fac0: 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
fad0: 7a 65 3b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ze;;.      if( s
fae0: 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
faf0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
fb00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fb10: 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c  P_Integer, size,
fb20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
fb30: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
fb40: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43  , ArraySize(getC
fb50: 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61  acheSize), getCa
fb60: 63 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  cheSize);.    }e
fb70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  lse{.      int s
fb80: 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68  ize = atoi(zRigh
fb90: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  t);.      if( si
fba0: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
fbb0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ize;.      if( d
fbc0: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20  b->cache_size<0 
fbd0: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
fbe0: 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f        db->cache_
fbf0: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
fc00: 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65     sqliteBtreeSe
fc10: 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70  tCacheSize(db->p
fc20: 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  Be, db->cache_si
fc30: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ze);.    }.  }el
fc40: 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  se..  /*.  **  P
fc50: 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79  RAGMA default_sy
fc60: 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20  nchronous.  **  
fc70: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73  PRAGMA default_s
fc80: 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45  ynchronous=BOOLE
fc90: 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  AN.  **.  ** The
fca0: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 74 75   first form retu
fcb0: 72 6e 73 20 74 68 65 20 70 65 72 73 69 73 74 65  rns the persiste
fcc0: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
fcd0: 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65  "synchronous" se
fce0: 74 74 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20  tting.  ** that 
fcf0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
fd00: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
fd10: 20 69 73 20 74 68 65 20 73 79 6e 63 68 72 6f 6e   is the synchron
fd20: 6f 75 73 20 73 65 74 74 69 6e 67 20 74 68 61 74  ous setting that
fd30: 0a 20 20 2a 2a 20 69 73 20 75 73 65 64 20 77 68  .  ** is used wh
fd40: 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62  enever the datab
fd50: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 75 6e  ase is opened un
fd60: 6c 65 73 73 20 6f 76 65 72 72 69 64 64 65 6e 20  less overridden 
fd70: 62 79 20 61 20 73 65 70 61 72 61 74 65 0a 20 20  by a separate.  
fd80: 2a 2a 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  ** "synchronous"
fd90: 20 70 72 61 67 6d 61 2e 20 20 54 68 65 20 73 65   pragma.  The se
fda0: 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65  cond form change
fdb0: 73 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  s the persistent
fdc0: 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f   and the.  ** lo
fdd0: 63 61 6c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  cal synchronous 
fde0: 73 65 74 74 69 6e 67 20 74 6f 20 74 68 65 20 76  setting to the v
fdf0: 61 6c 75 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a  alue given..  **
fe00: 0a 20 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f  .  ** If synchro
fe10: 6e 6f 75 73 20 69 73 20 6f 6e 2c 20 53 51 4c 69  nous is on, SQLi
fe20: 74 65 20 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73  te will do an fs
fe30: 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
fe40: 6c 20 61 74 20 73 74 72 61 74 65 67 69 63 0a 20  l at strategic. 
fe50: 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 69 6e   ** points to in
fe60: 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 72  sure that all pr
fe70: 65 76 69 6f 75 73 6c 79 20 77 72 69 74 74 65 6e  eviously written
fe80: 20 64 61 74 61 20 68 61 73 20 61 63 74 75 61 6c   data has actual
fe90: 6c 79 20 62 65 65 6e 0a 20 20 2a 2a 20 77 72 69  ly been.  ** wri
fea0: 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
feb0: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
fec0: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  e continuing.  T
fed0: 68 69 73 20 6d 6f 64 65 20 69 6e 73 75 72 65 73  his mode insures
fee0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 64   that.  ** the d
fef0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 77  atabase will alw
ff00: 61 79 73 20 62 65 20 69 6e 20 61 20 63 6f 6e 73  ays be in a cons
ff10: 69 73 74 65 6e 74 20 73 74 61 74 65 20 65 76 65  istent state eve
ff20: 6e 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  nt if the operat
ff30: 69 6e 67 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20  ing.  ** system 
ff40: 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
ff50: 20 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 65 72   to the computer
ff60: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20   is interrupted 
ff70: 75 6e 65 78 70 65 63 74 65 64 6c 79 2e 0a 20 20  unexpectedly..  
ff80: 2a 2a 20 57 68 65 6e 20 73 79 6e 63 68 72 6f 6e  ** When synchron
ff90: 6f 75 73 20 69 73 20 6f 66 66 2c 20 53 51 4c 69  ous is off, SQLi
ffa0: 74 65 20 77 69 6c 6c 20 6e 6f 74 20 77 61 69 74  te will not wait
ffb0: 20 66 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20   for changes to 
ffc0: 61 63 74 75 61 6c 6c 79 0a 20 20 2a 2a 20 62 65  actually.  ** be
ffd0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
ffe0: 64 69 73 6b 20 62 65 66 6f 72 65 20 63 6f 6e 74  disk before cont
fff0: 69 6e 75 69 6e 67 2e 20 20 41 73 20 73 6f 6f 6e  inuing.  As soon
10000 20 61 73 20 69 74 20 68 61 6e 64 73 20 63 68 61   as it hands cha
10010 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nges.  ** to the
10020 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
10030 6d 2c 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  m, it assumes th
10040 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 61  at the changes a
10050 72 65 20 70 65 72 6d 61 6e 65 6e 74 20 61 6e 64  re permanent and
10060 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 74 69 6e 75  .  ** it continu
10070 65 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 20 64  es going.  The d
10080 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
10090 65 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 61  e corrupted by a
100a0 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68 0a 20   program crash. 
100b0 20 2a 2a 20 65 76 65 6e 20 77 69 74 68 20 73 79   ** even with sy
100c0 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66 2c 20 62  nchronous off, b
100d0 75 74 20 61 6e 20 6f 70 65 72 61 74 69 6e 67 20  ut an operating 
100e0 73 79 73 74 65 6d 20 63 72 61 73 68 20 6f 72 20  system crash or 
100f0 70 6f 77 65 72 20 6c 6f 73 73 0a 20 20 2a 2a 20  power loss.  ** 
10100 63 6f 75 6c 64 20 70 6f 74 65 6e 74 69 61 6c 6c  could potentiall
10110 79 20 63 6f 72 72 75 70 74 20 64 61 74 61 2e 20  y corrupt data. 
10120 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
10130 6e 64 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  nd, synchronous 
10140 6f 66 66 20 69 73 0a 20 20 2a 2a 20 66 61 73 74  off is.  ** fast
10150 65 72 20 74 68 61 6e 20 73 79 6e 63 68 72 6f 6e  er than synchron
10160 6f 75 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ous on..  */.  i
10170 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
10180 28 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f  (zLeft,"default_
10190 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30  synchronous")==0
101a0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
101b0 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20  dbeOp getSync[] 
101c0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  = {.      { OP_I
101d0 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30  nteger,     0, 0
101e0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
101f0 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
10200 69 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20  ie,  0, 2,      
10210 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
10220 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c  _Integer,     0,
10230 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
10240 20 20 20 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20       { OP_Lt,   
10250 20 20 20 20 20 20 20 30 2c 20 35 2c 20 20 20 20         0, 5,    
10260 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
10270 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20  OP_AddImm,      
10280 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
10290 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
102a0 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20  mnCount, 1, 0,  
102b0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
102c0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
102d0 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
102e0 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20  synchronous"},. 
102f0 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61       { OP_Callba
10300 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ck,    1, 0,    
10310 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
10320 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
10330 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
10340 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
10350 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
10360 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c  f( pRight->z==pL
10370 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  eft->z ){.      
10380 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
10390 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
103a0 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79  (getSync), getSy
103b0 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nc);.    }else{.
103c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
103d0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
103e0 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b   db->cache_size;
103f0 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c  .      if( size<
10400 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65  0 ) size = -size
10410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65  ;.      sqliteBe
10420 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
10430 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  n(pParse, 0);.  
10440 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10450 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
10460 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  okie, 0, 2);.   
10470 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10480 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
10490 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   0);.      addr 
104a0 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
104b0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
104c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
104d0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
104e0 20 4f 50 5f 4e 65 2c 20 30 2c 20 61 64 64 72 2b   OP_Ne, 0, addr+
104f0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
10500 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10510 41 64 64 49 6d 6d 2c 20 4d 41 58 5f 50 41 47 45  AddImm, MAX_PAGE
10520 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  S, 0);.      sql
10530 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10540 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20  OP_AbsValue, 0, 
10550 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67  0);.      if( !g
10560 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
10570 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
10580 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10590 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20  OP_Negative, 0, 
105a0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65  0);.        size
105b0 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
105c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
105d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
105e0 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  tCookie, 0, 2);.
105f0 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57        sqliteEndW
10600 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10610 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d  arse);.      db-
10620 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
10630 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
10640 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
10650 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63  e(db->pBe, db->c
10660 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
10670 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a  }.  }else..  /*.
10680 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79    **   PRAGMA sy
10690 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20  nchronous.  **  
106a0 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
106b0 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a  ous=BOOLEAN.  **
106c0 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
106d0 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
106e0 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
106f0 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
10700 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
10710 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
10720 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
10730 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
10740 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
10750 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
10760 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
10770 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
10780 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
10790 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
107a0 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
107b0 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68 72  mp(zLeft,"synchr
107c0 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20  onous")==0 ){.  
107d0 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
107e0 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20  getSync[] = {.  
107f0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
10800 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
10810 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
10820 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
10830 2c 20 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e  , 0,        "syn
10840 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20  chronous"},.    
10850 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
10860 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
10870 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
10880 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
10890 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
108a0 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
108b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
108c0 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74  pRight->z==pLeft
108d0 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
108e0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
108f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
10900 63 61 63 68 65 5f 73 69 7a 65 3e 3d 30 2c 20 30  cache_size>=0, 0
10910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
10920 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
10930 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e  ArraySize(getSyn
10940 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20  c), getSync);.  
10950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10960 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61  nt size = db->ca
10970 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20  che_size;.      
10980 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
10990 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
109a0 20 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e   if( !getBoolean
109b0 28 7a 52 69 67 68 74 29 20 29 20 73 69 7a 65 20  (zRight) ) size 
109c0 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64  = -size;.      d
109d0 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
109e0 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
109f0 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53  teBtreeSetCacheS
10a00 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d  ize(db->pBe, db-
10a10 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
10a20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
10a30 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
10a40 28 7a 4c 65 66 74 2c 20 22 74 72 69 67 67 65 72  (zLeft, "trigger
10a50 5f 6f 76 65 72 68 65 61 64 5f 74 65 73 74 22 29  _overhead_test")
10a60 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
10a70 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
10a80 29 20 29 7b 0a 20 20 20 20 20 20 61 6c 77 61 79  ) ){.      alway
10a90 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73  s_code_trigger_s
10aa0 65 74 75 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65  etup = 1;.    }e
10ab0 6c 73 65 7b 0a 20 20 20 20 20 20 61 6c 77 61 79  lse{.      alway
10ac0 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73  s_code_trigger_s
10ad0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  etup = 0;.    }.
10ae0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
10af0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10b00 66 74 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22  ft, "vdbe_trace"
10b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
10b20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
10b30 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
10b40 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10b50 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d  VdbeTrace;.    }
10b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
10b70 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
10b80 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20  _VdbeTrace;.    
10b90 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
10ba0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10bb0 4c 65 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75  Left, "full_colu
10bc0 6d 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b  mn_names")==0 ){
10bd0 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
10be0 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
10bf0 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
10c00 3d 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  = SQLITE_FullCol
10c10 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Names;.    }else
10c20 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
10c30 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
10c40 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d  lColNames;.    }
10c50 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
10c60 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
10c70 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74  eft, "result_set
10c80 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b  _details")==0 ){
10c90 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
10ca0 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
10cb0 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
10cc0 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44  = SQLITE_ResultD
10cd0 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73  etails;.    }els
10ce0 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
10cf0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65  gs &= ~SQLITE_Re
10d00 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
10d10 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
10d20 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
10d30 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68  zLeft, "count_ch
10d40 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  anges")==0 ){.  
10d50 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
10d60 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
10d70 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
10d80 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b  QLITE_CountRows;
10d90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10da0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
10db0 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
10dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
10dd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10de0 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70  ICmp(zLeft, "emp
10df0 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61  ty_result_callba
10e00 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cks")==0 ){.    
10e10 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
10e20 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
10e30 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10e40 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
10e50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10e60 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
10e70 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c  ~SQLITE_NullCall
10e80 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  back;.    }.  }e
10e90 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
10ea0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
10eb0 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30  "table_info")==0
10ec0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
10ed0 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
10ee0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
10ef0 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
10f00 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
10f10 28 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c  ( pTab ) v = sql
10f20 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
10f30 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  e);.    if( pTab
10f40 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73   && v ){.      s
10f50 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62  tatic VdbeOp tab
10f60 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20  leInfoPreface[] 
10f70 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
10f80 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c  _ColumnCount, 5,
10f90 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
10fa0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10fb0 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
10fc0 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
10fd0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
10fe0 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
10ff0 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
11000 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
11010 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
11020 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20   "type"},.      
11030 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11040 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20  e,  3, 0,       
11050 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20  "notnull"},.    
11060 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11070 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20  ame,  4, 0,     
11080 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c    "dflt_value"},
11090 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
110a0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
110b0 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
110c0 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61  (v, ArraySize(ta
110d0 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c  bleInfoPreface),
110e0 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
110f0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11100 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
11110 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
11120 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11130 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
11140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
11150 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11160 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
11170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11180 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11190 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
111a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
111b0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
111c0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
111d0 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
111e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
111f0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11200 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
11210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11220 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11230 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  , .           pT
11240 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
11250 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e ? pTab->aCol[i
11260 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22  ].zType : "text"
11270 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
11280 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11290 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
112a0 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ger, pTab->aCol[
112b0 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a  i].notNull, 0);.
112c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
112d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
112e0 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
112f0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
11300 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
11310 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  Tab->aCol[i].zDf
11320 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  lt, P3_STATIC);.
11330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11340 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
11350 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20  llback, 5, 0);. 
11360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11370 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
11380 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
11390 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d   "index_info")==
113a0 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
113b0 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
113c0 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
113d0 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73  *v;.    pIdx = s
113e0 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
113f0 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
11400 69 66 28 20 70 49 64 78 20 29 20 76 20 3d 20 73  if( pIdx ) v = s
11410 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
11420 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  rse);.    if( pI
11430 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  dx && v ){.     
11440 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
11450 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
11460 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
11470 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
11480 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
11490 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
114a0 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
114b0 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a        "seqno"},.
114c0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
114d0 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
114e0 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
114f0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11500 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20  nName,  2, 0,   
11510 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
11520 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
11530 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  i;.      pTab = 
11540 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
11550 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11560 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
11570 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72  Size(tableInfoPr
11580 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66  eface), tableInf
11590 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20  oPreface);.     
115a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
115b0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
115c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75  .        int cnu
115d0 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  m = pIdx->aiColu
115e0 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73  mn[i];.        s
115f0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11600 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
11610 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
11620 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11630 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d  OP_Integer, cnum
11640 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
11650 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11660 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
11670 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
11680 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e  t( pTab->nCol>cn
11690 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  um );.        sq
116a0 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
116b0 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43  (v, -1, pTab->aC
116c0 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20  ol[cnum].zName, 
116d0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
116e0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
116f0 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
11700 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20  ck, 3, 0);.     
11710 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
11720 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
11730 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e  rICmp(zLeft, "in
11740 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b  dex_list")==0 ){
11750 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
11760 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
11770 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  b;.    Vdbe *v;.
11780 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
11790 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
117a0 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
117b0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20  pTab ){.      v 
117c0 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
117d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
117e0 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  Idx = pTab->pInd
117f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
11800 28 20 70 54 61 62 20 26 26 20 70 49 64 78 20 26  ( pTab && pIdx &
11810 26 20 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  & v ){.      int
11820 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73   i = 0; .      s
11830 74 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64  tatic VdbeOp ind
11840 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20  exListPreface[] 
11850 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
11860 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c  _ColumnCount, 3,
11870 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
11880 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11890 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
118a0 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20      "seq"},.    
118b0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
118c0 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
118d0 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
118e0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
118f0 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
11900 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20   "unique"},.    
11910 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69    };..      sqli
11920 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
11930 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64  v, ArraySize(ind
11940 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20  exListPreface), 
11950 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65  indexListPreface
11960 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70  );.      while(p
11970 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Idx){.        sq
11980 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11990 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
119a0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
119b0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
119c0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
119d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
119e0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
119f0 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
11a00 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
11a10 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11a20 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
11a30 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  r, pIdx->onError
11a40 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20  !=OE_None, 0);. 
11a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
11a60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
11a70 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
11a80 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
11a90 20 20 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e     pIdx = pIdx->
11aa0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
11ab0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
11ac0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
11ad0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
11ae0 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f  (zLeft, "parser_
11af0 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
11b00 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71    extern void sq
11b10 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
11b20 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a  FILE*, char *);.
11b30 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
11b40 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
11b50 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72      sqliteParser
11b60 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70  Trace(stdout, "p
11b70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d  arser: ");.    }
11b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
11b90 74 65 50 61 72 73 65 72 54 72 61 63 65 28 30 2c  teParserTrace(0,
11ba0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
11bb0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
11bc0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11bd0 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79  Left, "integrity
11be0 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  _check")==0 ){. 
11bf0 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
11c00 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20   checkDb[] = {. 
11c10 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
11c20 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
11c30 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20      "2"},.      
11c40 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20  { OP_Open,      
11c50 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
11c60 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
11c70 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20 36 2c  wind,      0, 6,
11c80 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
11c90 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
11ca0 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
11cb0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11cc0 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20  SetInsert,   0, 
11cd0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11ce0 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
11cf0 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20        0, 3,     
11d00 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
11d10 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30  P_IntegrityCk, 0
11d20 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
11d30 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11d40 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
11d50 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
11d60 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
11d70 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 69   0, 0,        "i
11d80 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 7d  ntegrity_check"}
11d90 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
11da0 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
11db0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
11dc0 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
11dd0 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
11de0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
11df0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11e00 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11e10 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
11e20 7a 65 28 63 68 65 63 6b 44 62 29 2c 20 63 68 65  ze(checkDb), che
11e30 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  ckDb);.  }else..
11e40 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72 65    {}.  sqliteFre
11e50 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  e(zLeft);.  sqli
11e60 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a  teFree(zRight);.
11e70 7d 0a                                            }.