/ Hex Artifact Content
Login

Artifact d01b81f41481e733e27ab2fa8e1bfcc64f24257d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 38 36 20 32 30 30  ild.c,v 1.86 200
0310: 32 2f 30 33 2f 30 36 20 32 32 3a 30 31 3a 33 36  2/03/06 22:01:36
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 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2010: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2020: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2030: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2040: 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20  uns when one or 
2050: 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42 4c  more CREATE TABL
2060: 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58 2c  E, CREATE INDEX,
2070: 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c 20  .** DROP TABLE, 
2080: 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  or DROP INDEX st
2090: 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72 6f  atements gets ro
20a0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65 0a  lled back.  The.
20b0: 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20  ** additions or 
20c0: 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61 62  deletions of Tab
20d0: 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72  le and Index str
20e0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a 2a  uctures in the.*
20f0: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
2100: 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f 6e  tables are undon
2110: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
2120: 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  o: sqliteCommitI
2130: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29  nternalChanges()
2140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
2150: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2160: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2170: 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65 6c  b){.  Hash toDel
2180: 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  ete;.  HashElem 
2190: 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28 64  *pElem;.  if( (d
21a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
21b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
21c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
21d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
21e0: 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54 45  toDelete, SQLITE
21f0: 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20 30  _HASH_POINTER, 0
2200: 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  );.  db->next_co
2210: 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d  okie = db->schem
2220: 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72 28  a_cookie;.  for(
2230: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2240: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
2250: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
2260: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2270: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
2280: 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71  ble *pTable = sq
2290: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
22a0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  em);.    if( !pT
22b0: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  able->isCommit )
22c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
22d0: 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65  shInsert(&toDele
22e0: 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20 70  te, pTable, 0, p
22f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
2300: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
2310: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2320: 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d 3b  oDelete); pElem;
2330: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2340: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2350: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2360: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2370: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
2380: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
2390: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
23a0: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
23b0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f 44  teHashClear(&toD
23c0: 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70 45  elete);.  for(pE
23d0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23e0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
23f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2400: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2410: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
2420: 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73 71  e *pOld, *p = sq
2430: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2440: 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
2450: 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   p->isCommit );.
2460: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2470: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2480: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
2490: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
24a0: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
24b0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
24c0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
24d0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
24e0: 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  ear(&db->tblDrop
24f0: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2500: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2510: 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  db->idxHash); pE
2520: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2530: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2540: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
2550: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61 73  ndex = sqliteHas
2560: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2570: 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 69    if( !pIndex->i
2580: 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  sCommit ){.     
2590: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
25a0: 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49 6e  t(&toDelete, pIn
25b0: 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29 3b  dex, 0, pIndex);
25c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
25d0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
25e0: 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65  hFirst(&toDelete
25f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2600: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2610: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
2620: 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  x *pIndex = sqli
2630: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  );.    sqliteUnl
2650: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2660: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
2670: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2680: 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b  lear(&toDelete);
2690: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
26a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
26b0: 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c 65  ->idxDrop); pEle
26c0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
26d0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
26e0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  .    Index *pOld
26f0: 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73  , *p = sqliteHas
2700: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2710: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 43    assert( p->isC
2720: 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d 3e  ommit );.    p->
2730: 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a 20  isDropped = 0;. 
2740: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
2750: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2760: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2770: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2780: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 61  me)+1, p);.    a
2790: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
27a0: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 7d  | pOld==p );.  }
27b0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
27c0: 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29  ar(&db->idxDrop)
27d0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
27e0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
27f0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2800: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e   Construct the n
2810: 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61  ame of a user ta
2820: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f  ble or index fro
2830: 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  m a token..**.**
2840: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2850: 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  he name is obtai
2860: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
2870: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
2880: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
2890: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
28a0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
28b0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
28c0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
28d0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
28e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
28f0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
2900: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
2910: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
2920: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
2940: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
2950: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
2960: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
2970: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
2980: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
2990: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
29a0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
29b0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
29c0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
29d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
29e0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
29f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a00: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
2a10: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
2a20: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
2a30: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
2a40: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
2a50: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
2a60: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
2a70: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
2a80: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
2a90: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
2aa0: 72 75 65 20 69 66 20 74 68 65 20 22 54 45 4d 50  rue if the "TEMP
2ab0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
2ac0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
2ad0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
2ae0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
2af0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
2b00: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
2b10: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
2b20: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
2b30: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
2b40: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
2b50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2b60: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
2b70: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
2b80: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
2b90: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
2ba0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2bb0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
2bc0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
2bd0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
2be0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
2bf0: 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  e sqliteEndTable
2c00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
2c10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
2c20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
2c30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
2c40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
2c50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72  .void sqliteStar
2c60: 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  tTable(Parse *pP
2c70: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74  arse, Token *pSt
2c80: 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  art, Token *pNam
2c90: 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  e, int isTemp){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
2cb0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2cc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2cd0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
2ce0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
2cf0: 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e   *v;..  pParse->
2d00: 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70  sFirstToken = *p
2d10: 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d  Start;.  zName =
2d20: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
2d30: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
2d40: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
2d50: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
2d60: 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   Before trying t
2d70: 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f  o create a tempo
2d80: 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65  rary table, make
2d90: 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20   sure the Btree 
2da0: 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67  for.  ** holding
2db0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2dc0: 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  s is open..  */.
2dd0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
2de0: 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29  db->pBeTemp==0 )
2df0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2e00: 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30  qliteBtreeOpen(0
2e10: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
2e20: 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20  &db->pBeTemp);. 
2e30: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2e50: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2e60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2e70: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
2e80: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
2e90: 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
2ea0: 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
2eb0: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
2ec0: 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  es", 0);.      p
2ed0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2ef0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
2f00: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f10: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
2f20: 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42  c = sqliteBtreeB
2f30: 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42  eginTrans(db->pB
2f40: 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  eTemp);.      if
2f50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f70: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2f80: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
2f90: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
2fa0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
2fb0: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
2fc0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
2fd0: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
2fe0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2ff0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3000: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3010: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3020: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3030: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3040: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3050: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3060: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3070: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3080: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3090: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
30a0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
30b0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
30c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
30d0: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
30e0: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
30f0: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3100: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3110: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3120: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3130: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3140: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3150: 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e 65  en ignore the ne
3160: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
3170: 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  e..  ** We will 
3180: 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67  continue parsing
3190: 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73 65  , but the pParse
31a0: 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61 67  ->nameClash flag
31b0: 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a   will be set.  *
31c0: 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  * so we will kno
31d0: 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68 65  w to discard the
31e0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e   table record on
31f0: 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20 66  ce parsing has f
3200: 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  inished..  */.  
3210: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
3220: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
3230: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
3240: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e!=0 ){.    if( 
3250: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26  pTable->isTemp &
3260: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
3270: 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ag ){.      pPar
3280: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3290: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
32a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
32b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
32c0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
32d0: 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e   0, pName->z, pN
32e0: 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20  ame->n,.        
32f0: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
3300: 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ts", 0, 0);.    
3310: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3320: 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
3330: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3340: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
3360: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3370: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  0;.  }.  if( (pI
3380: 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  dx = sqliteFindI
3390: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29  ndex(db, zName))
33a0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
33b0: 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   (!pIdx->pTable-
33c0: 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72  >isTemp || !pPar
33d0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
33e0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
33f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3400: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
3410: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3420: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
3430: 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20     zName, 0);.  
3440: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3450: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
3460: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
3470: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3480: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3490: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
34a0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
34b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
34c0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
34d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
34e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
34f0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
3500: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3510: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3520: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3530: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3540: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3550: 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73 54  le->isTemp = isT
3560: 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73  emp;.  if( pPars
3570: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
3580: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
3590: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
35a0: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
35b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
35c0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
35d0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
35e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
35f0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
3600: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
3610: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
3620: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
3630: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
3640: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
3650: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
3660: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
3670: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
3680: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
3690: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
36a0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
36b0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
36c0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
36d0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
36e0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
36f0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
3700: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
3710: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
3720: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
3730: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
3740: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
3750: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3760: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
3770: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
3780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
3790: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
37a0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74  & (v = sqliteGet
37b0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
37c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65   ){.    sqliteBe
37d0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
37e0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  n(pParse);.    i
37f0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3800: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3810: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3820: 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  r, db->file_form
3830: 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  at, 0);.      sq
3840: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3850: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
3860: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3870: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3880: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
3890: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
38a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
38b0: 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  -1, MASTER_NAME,
38c0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
38d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
38e0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
38f0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3900: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3910: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
3920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3930: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3940: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
3950: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3960: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
3970: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ey, 0, 0);.    }
3980: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3990: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
39a0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
39b0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
39c0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
39d0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
39e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
39f0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3a00: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
3a10: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
3a20: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
3a30: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
3a40: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
3a50: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
3a60: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
3a70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
3a80: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
3a90: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
3aa0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
3ab0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
3ac0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
3ad0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
3ae0: 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66   char **pz;.  if
3af0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
3b00: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
3b10: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d  eturn;.  if( (p-
3b20: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
3b30: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
3b40: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
3b50: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
3b60: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
3b70: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
3b80: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
3b90: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
3ba0: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
3bb0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d   aNew;.  }.  mem
3bc0: 73 65 74 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  set(&p->aCol[p->
3bd0: 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nCol], 0, sizeof
3be0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
3bf0: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70   pz = &p->aCol[p
3c00: 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b  ->nCol++].zName;
3c10: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
3c20: 69 6e 67 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a  ing(pz, pName->z
3c30: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
3c40: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
3c50: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  *pz);.}../*.** T
3c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3c70: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3c80: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
3c90: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
3ca0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
3cb0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3cc0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
3cd0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
3ce0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
3cf0: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
3d00: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
3d10: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
3d20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
3d30: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3d40: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3d50: 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75  d sqliteAddNotNu
3d60: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
3d70: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
3d80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
3d90: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
3da0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3db0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
3dc0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
3dd0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
3de0: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
3df0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
3e00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3e10: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
3e20: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
3e30: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
3e40: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
3e50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3e60: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
3e70: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
3e80: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
3e90: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
3ea0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
3eb0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
3ec0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
3ed0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
3ee0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
3ef0: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
3f00: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
3f10: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
3f20: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
3f30: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
3f40: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
3f50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
3f60: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
3f70: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
3f80: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
3f90: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
3fa0: 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54  sqliteAddColumnT
3fb0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
3fc0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74  e, Token *pFirst
3fd0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b  , Token *pLast){
3fe0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
3ff0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
4000: 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70  ;.  char *z, **p
4010: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
4020: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4030: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4040: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4050: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
4060: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
4070: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b 0a 20 20 6e  ol[i].zType;.  n
4080: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64   = pLast->n + Ad
4090: 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41  dr(pLast->z) - A
40a0: 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a  ddr(pFirst->z);.
40b0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
40c0: 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a  ng(pz, pFirst->z
40d0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a  , n, 0);.  z = *
40e0: 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  pz;.  if( z==0 )
40f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4100: 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  =j=0; z[i]; i++)
4110: 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b  {.    int c = z[
4120: 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70  i];.    if( issp
4130: 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75  ace(c) ) continu
4140: 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  e;.    z[j++] = 
4150: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
4160: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
4170: 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74  given token is t
4180: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
4190: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f   for the last co
41a0: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a  lumn added to.**
41b0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
41c0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
41d0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69  ruction.  If "mi
41e0: 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65  nusFlag" is true
41f0: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
4200: 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61  e value token wa
4210: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
4220: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
4230: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4240: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4250: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4260: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4270: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4280: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4290: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
42a0: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
42b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
42c0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
42d0: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
42e0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
42f0: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
4300: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
4310: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
4320: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4330: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4340: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
4350: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69   pz = &p->aCol[i
4360: 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d  ].zDflt;.  if( m
4370: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
4380: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4390: 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61  (pz, "-", 1, pVa
43a0: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
43b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
43c0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
43d0: 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  (pz, pVal->z, pV
43e0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20  al->n, 0);.  }. 
43f0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
4400: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
4410: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
4420: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
4430: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
4440: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
4450: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
4460: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
4470: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
4480: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
4490: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
44a0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
44b0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
44c0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
44d0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
44e0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
44f0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
4500: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
4510: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
4520: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
4530: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
4540: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
4550: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
4560: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
4570: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
4580: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
4590: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
45a0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
45b0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
45c0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
45d0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
45e0: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
45f0: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
4600: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
4610: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
4620: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
4630: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
4640: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
4650: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
4660: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
4670: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
4680: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
4690: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
46a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
46b0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
46c0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
46d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
46e0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
46f0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
4700: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
4710: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
4720: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
4730: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
4740: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
4750: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
4760: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
4770: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
4780: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
4790: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
47a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
47b0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
47c0: 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79  iteAddPrimaryKey
47d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
47e0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  IdList *pList, i
47f0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
4800: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
4810: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
4820: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
4830: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
4840: 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -1;.  if( pTab==
4850: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
4860: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
4870: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
4880: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4890: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
48a0: 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  le \"", pTab->zN
48b0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c  ame, .        "\
48c0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
48d0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
48e0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
48f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
4900: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
4910: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
4920: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
4930: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
4940: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
4950: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
4960: 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20  ->nId==1 ){.    
4970: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
4980: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
4990: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
49a0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
49b0: 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ist->a[0].zName,
49c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
49d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
49e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
49f0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
4a00: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
4a10: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
4a20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
4a30: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
4a40: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
4a50: 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a  e_format>=1 && .
4a60: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
4a70: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
4a80: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
4a90: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
4aa0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
4ab0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
4ac0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
4ae0: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  teCreateIndex(pP
4af0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73  arse, 0, 0, pLis
4b00: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
4b10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4b20: 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e  Come up with a n
4b30: 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  ew random value 
4b40: 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  for the schema c
4b50: 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72  ookie.  Make sur
4b60: 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c  e.** the new val
4b70: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ue is different 
4b80: 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a  from the old..**
4b90: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
4ba0: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
4bb0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
4bc0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
4bd0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
4be0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
4bf0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
4c00: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
4c10: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
4c20: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
4c30: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
4c40: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
4c50: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
4c60: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
4c70: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
4c80: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
4c90: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
4ca0: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
4cb0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
4cc0: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
4cd0: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
4ce0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
4cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
4d00: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
4d10: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
4d20: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
4d30: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
4d40: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
4d50: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
4d60: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
4d70: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
4d80: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
4d90: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
4da0: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
4db0: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
4dc0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
4dd0: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
4de0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
4df0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
4e00: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
4e10: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
4e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e30: 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c  changeCookie(sql
4e40: 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  ite *db){.  if( 
4e50: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d  db->next_cookie=
4e60: 3d 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  =db->schema_cook
4e70: 69 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65  ie ){.    db->ne
4e80: 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  xt_cookie = db->
4e90: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20  schema_cookie + 
4ea0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65  sqliteRandomByte
4eb0: 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e  () + 1;.    db->
4ec0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4ed0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
4ee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73   }.}../*.** Meas
4ef0: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
4f00: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
4f10: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
4f20: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
4f30: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
4f40: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
4f50: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
4f60: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
4f70: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
4f80: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
4f90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4fa0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
4fb0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
4fc0: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51  t n;.  int needQ
4fd0: 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  uote = 0;.  for(
4fe0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
4ff0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
5000: 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65  '\'' ){ n++; nee
5010: 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a  dQuote=1; }.  }.
5020: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65    return n + nee
5030: 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a  dQuote*2;.}../*.
5040: 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e  ** Write an iden
5050: 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20  tifier onto the 
5060: 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  end of the given
5070: 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a   string.  Add.**
5080: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
5090: 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s as needed..*/.
50a0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
50b0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
50c0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
50d0: 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c  Ident){.  int i,
50e0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
50f0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
5100: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
5110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
5120: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
5130: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
5140: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
5150: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
5160: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
5170: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
5180: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
5190: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
51a0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
51b0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
51c0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
51d0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
51e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
51f0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
5200: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
5210: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
5220: 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b  nt[j]=='\'' ) z[
5230: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d  i++] = '\'';.  }
5240: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
5250: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
5260: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
5270: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
5280: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
5290: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
52a0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
52b0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
52c0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
52d0: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
52e0: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
52f0: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
5300: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
5310: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
5320: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
5330: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
5350: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
5360: 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  t(Table *p){.  i
5370: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
5380: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
5390: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
53a0: 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b   *zEnd;.  n = 0;
53b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
53c0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
53d0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
53e0: 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  h(p->aCol[i].zNa
53f0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  me);.  }.  n += 
5400: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
5410: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34  Name);.  if( n<4
5420: 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  0 ){.    zSep = 
5430: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
5440: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
5450: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
5460: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
5470: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
5480: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
5490: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
54a0: 2b 3d 20 32 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 25 + 6*p->nCo
54b0: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
54c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a  iteMalloc( n );.
54d0: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
54e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
54f0: 65 72 74 28 20 21 70 2d 3e 69 73 54 65 6d 70 20  ert( !p->isTemp 
5500: 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  );.  strcpy(zStm
5510: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
5520: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
5530: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
5540: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
5550: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
5560: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
5570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5580: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
5590: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
55a0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
55b0: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
55c0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
55d0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
55e0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
55f0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
5600: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
5610: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
5620: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
5630: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5640: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5650: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
5660: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
5670: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
5680: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5690: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
56a0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
56b0: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
56c0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
56d0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
56e0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
56f0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
5700: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
5710: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
5720: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
5730: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
5740: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
5750: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
5760: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20  ble on disk,.** 
5770: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
5780: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
5790: 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e   or initFlag==1.
57a0: 20 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d    When initFlag=
57b0: 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  =1,.** it means 
57c0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
57d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
57e0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
57f0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
5800: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
5810: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
5820: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
5830: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
5840: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
5850: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
5860: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
5870: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
5880: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5890: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
58a0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
58b0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
58c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
58d0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
58e0: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
58f0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
5900: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
5910: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
5920: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
5930: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
5940: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
5950: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
5960: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
5970: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
5980: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
5990: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
59a0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
59b0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
59c0: 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  teEndTable(Parse
59d0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
59e0: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
59f0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
5a00: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *p;.  sqlite *d
5a10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5a20: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
5a30: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
5a40: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
5a50: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
5a60: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5a70: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
5a80: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
5a90: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
5aa0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
5ab0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
5ac0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
5ad0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
5ae0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  se..  */.  asser
5af0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  t( pParse->nameC
5b00: 6c 61 73 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73  lash==0 || pPars
5b10: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29  e->initFlag==1 )
5b20: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
5b30: 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50  explain==0 && pP
5b40: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d  arse->nameClash=
5b50: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
5b60: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20  *pOld;.    pOld 
5b70: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
5b80: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
5b90: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
5ba0: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
5bb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
5bc0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5bd0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
5be0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
5bf0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
5c00: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
5c10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5c20: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
5c30: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
5c40: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
5c50: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5c60: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
5c70: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
5c80: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
5c90: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
5ca0: 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63  a SELECT, then c
5cb0: 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a  onstruct the.  *
5cc0: 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * list of column
5cd0: 73 20 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f  s and the text o
5ce0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
5cf0: 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  /.  if( pSelect 
5d00: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53  ){.    Table *pS
5d10: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65  elTab = sqliteRe
5d20: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
5d30: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
5d40: 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65  ct);.    if( pSe
5d50: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
5d60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
5d70: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
5d80: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
5d90: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  b->nCol;.    p->
5da0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
5db0: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
5dc0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
5dd0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
5de0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   0;.    sqliteDe
5df0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
5e00: 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lTab);.  }..  /*
5e10: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
5e20: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
5e30: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
5e40: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
5e50: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
5e60: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
5e70: 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  disk.  So do not
5e80: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
5e90: 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20  sk.  ** again.  
5ea0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
5eb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
5ec0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
5ed0: 74 68 65 20 0a 20 20 2a 2a 20 70 50 61 72 73 65  the .  ** pParse
5ee0: 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  ->newTnum field.
5ef0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
5f00: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  er should have b
5f10: 65 65 6e 20 70 75 74 0a 20 20 2a 2a 20 74 68 65  een put.  ** the
5f20: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
5f30: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
5f40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
5f50: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
5f60: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50      p->tnum = pP
5f70: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20  arse->newTnum;. 
5f80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
5f90: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
5fa0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
5fb0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
5fc0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
5fd0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
5fe0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
5ff0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
6000: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
6010: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
6020: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
6030: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
6040: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
6050: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
6060: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 74 68  PORARY table, th
6070: 65 6e 20 6a 75 73 74 20 63 72 65 61 74 65 20 74  en just create t
6080: 68 65 20 74 61 62 6c 65 2e 20 20 44 6f 20 6e 6f  he table.  Do no
6090: 74 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 6e 20 65  t.  ** make an e
60a0: 6e 74 72 79 20 69 6e 20 53 51 4c 49 54 45 5f 4d  ntry in SQLITE_M
60b0: 41 53 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ASTER..  */.  if
60c0: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
60d0: 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  lag ){.    int n
60e0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
60f0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
6100: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6110: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
6120: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d  turn;.    if( p-
6130: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
6140: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
6150: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
6160: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6170: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6180: 6c 65 2c 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70  le, 0, p->isTemp
6190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
61a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
61b0: 31 2c 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74  1, (char *)&p->t
61c0: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
61d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
61e0: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
61f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6210: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6220: 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
6230: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69  0;.    if( !p->i
6240: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
6250: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6260: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6270: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6280: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
6290: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
62a0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
62b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
62c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
62d0: 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65  P3(v, -1, "table
62e0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
62f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6300: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6310: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 76  angeP3(v, -1, "v
6320: 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29  iew", P3_STATIC)
6330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6340: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6350: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
6360: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6370: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6380: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6390: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
63a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
63b0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
63c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
63d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
63e0: 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  , -1, p->zName, 
63f0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6400: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6410: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20  p(v, OP_Dup, 4, 
6420: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6440: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6450: 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
6460: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
6470: 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c   *z = createTabl
6480: 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  eStmt(p);.      
6490: 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e    n = z ? strlen
64a0: 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  (z) : 0;.       
64b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
64c0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
64d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
64e0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 7d  Free(z);.      }
64f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6500: 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b  sert( pEnd!=0 );
6510: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41 64 64  .        n = Add
6520: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
6530: 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  r(pParse->sFirst
6540: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
6550: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6560: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6570: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
6580: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  ken.z, n);.     
6590: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
65a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
65b0: 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29  akeRecord, 5, 0)
65c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
65d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
65e0: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
65f0: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
6600: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71  ie(db);.      sq
6610: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6620: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6630: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29  >next_cookie, 0)
6640: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6650: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
6660: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a  tCookie, 0, 0);.
6670: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6680: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
6690: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  e, 0, 0);.    }.
66a0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
66b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
66c0: 3d 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  = p->isTemp ? OP
66d0: 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f  _OpenWrAux : OP_
66e0: 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
66f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6700: 28 76 2c 20 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  (v, op, 1, 0);. 
6710: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
6720: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
6730: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
6740: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
6750: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
6760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6770: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
6780: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
6790: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
67a0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
67b0: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
67c0: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
67d0: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
67e0: 71 6c 69 74 65 43 72 65 61 74 65 56 69 65 77 28  qliteCreateView(
67f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6800: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
6810: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6820: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
6830: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
6840: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
6850: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
6860: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
6870: 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  Name,      /* Th
6880: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
6890: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
68a0: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
68b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
68c0: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
68d0: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
68e0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
68f0: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65  iew */.){.  Toke
6900: 6e 20 73 45 6e 64 3b 0a 20 20 54 61 62 6c 65 20  n sEnd;.  Table 
6910: 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p;.  const char
6920: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 2c 20 6f 66   *z;.  int n, of
6930: 66 73 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65 53  fset;..  sqliteS
6940: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
6950: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c  , pBegin, pName,
6960: 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   0);.  p = pPars
6970: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
6980: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
6990: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
69a0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
69b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
69c0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
69d0: 65 63 74 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ect;.  if( !pPar
69e0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
69f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 56 69      if( sqliteVi
6a00: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
6a10: 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
6a20: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6a30: 20 7d 0a 20 20 7d 0a 20 20 73 45 6e 64 20 3d 20   }.  }.  sEnd = 
6a40: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
6a50: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
6a60: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
6a70: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
6a80: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
6a90: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
6aa0: 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29   0;.  n = ((int)
6ab0: 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70  sEnd.z) - (int)p
6ac0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
6ad0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
6ae0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
6af0: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
6b00: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
6b10: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
6b20: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
6b30: 2e 6e 20 3d 20 31 3b 0a 20 20 7a 20 3d 20 70 2d  .n = 1;.  z = p-
6b40: 3e 70 53 65 6c 65 63 74 2d 3e 7a 53 65 6c 65 63  >pSelect->zSelec
6b50: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
6b60: 70 28 7a 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  p(z, n);.  if( z
6b70: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
6b80: 20 28 28 69 6e 74 29 7a 29 20 2d 20 28 69 6e 74   ((int)z) - (int
6b90: 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 20 20  )pBegin->z;.    
6ba0: 73 71 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65  sqliteSelectMove
6bb0: 53 74 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65  Strings(p->pSele
6bc0: 63 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ct, offset);.   
6bd0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
6be0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
6bf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
6c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  .}../*.** The Ta
6c10: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
6c20: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
6c30: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
6c40: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
6c50: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
6c60: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
6c70: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
6c80: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
6c90: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
6ca0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
6cb0: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
6cc0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
6cd0: 20 70 50 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e   pPare->zErrMsg.
6ce0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 69  .*/.int sqliteVi
6cf0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
6d00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6d10: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
6d20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6d30: 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  st;.  Select *pS
6d40: 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  el;.  Table *pSe
6d50: 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72  lTab;.  int nErr
6d60: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6d70: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a   pTable );..  /*
6d80: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
6da0: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
6db0: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
6dc0: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
6dd0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
6de0: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
6df0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
6e00: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
6e10: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
6e20: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
6e30: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
6e40: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
6e50: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
6e60: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
6e70: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
6e80: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
6e90: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
6ea0: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
6eb0: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
6ec0: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
6ed0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
6ee0: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
6ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
6f00: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
6f10: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
6f20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
6f30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
6f40: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
6f50: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
6f60: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
6f70: 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61  sg, "view ", pTa
6f80: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
6f90: 20 20 20 20 20 22 20 69 73 20 63 69 72 63 75 6c       " is circul
6fa0: 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30  arly defined", 0
6fb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
6fc0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
6fd0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
6fe0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
6ff0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
7000: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
7010: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
7020: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
7030: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
7040: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
7050: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
7060: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
7070: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
7080: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
7090: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
70a0: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
70b0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
70c0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
70d0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
70e0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
70f0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
7100: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
7110: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
7120: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
7130: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
7140: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
7150: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
7160: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
7170: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
7180: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
7190: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
71a0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
71b0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
71c0: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
71d0: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
71e0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
71f0: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
7200: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
7210: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
7220: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
7230: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
7240: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
7250: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
7260: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
7270: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
7280: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
7290: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
72a0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
72b0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
72c0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
72d0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
72e0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
72f0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
7300: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
7310: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
7320: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
7330: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
7340: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
7350: 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
7360: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
7370: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
7380: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
7390: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
73a0: 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74  d(pSel);.  sqlit
73b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
73c0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSel->pEList);. 
73d0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
73e0: 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  pEList;.  return
73f0: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
7400: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
7410: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
7420: 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a  e VIEW pTable..*
7430: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7440: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
7450: 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74  ever any other t
7460: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
7470: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65  modified..** The
7480: 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74   view passed int
7490: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  o this routine m
74a0: 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65  ight depend dire
74b0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
74c0: 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64  ly.** on the mod
74d0: 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64  ified or deleted
74e0: 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65   table so we nee
74f0: 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f  d to clear the o
7500: 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d  ld column.** nam
7510: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  es so that they 
7520: 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74  will be recomput
7530: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7540: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
7550: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
7560: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
7570: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61  int i;.  if( pTa
7580: 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ble==0 || pTable
7590: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72  ->pSelect==0 ) r
75a0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61  eturn;.  if( pTa
75b0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72  ble->nCol==0 ) r
75c0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
75d0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
75e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
75f0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
7600: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
7610: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
7620: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  able->aCol[i].zD
7630: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
7640: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
7650: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d  l[i].zType);.  }
7660: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
7670: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  able->aCol);.  p
7680: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
7690: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
76a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
76b0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
76c0: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
76d0: 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VIEW..*/.void sq
76e0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
76f0: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
7700: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
7710: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
7720: 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69  SQLITE_UnresetVi
7730: 65 77 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ews)==0 ) return
7740: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
7750: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74  HashFirst(&db->t
7760: 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  blHash); i; i=sq
7770: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
7780: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
7790: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
77a0: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
77b0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
77c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77        sqliteView
77d0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
77e0: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
77f0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
7800: 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74   ~SQLITE_Unreset
7810: 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Views;.}../*.** 
7820: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c  Given a token, l
7830: 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77  ook up a table w
7840: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20  ith that name.  
7850: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65  If not found, le
7860: 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ave.** an error 
7870: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74  for the parser t
7880: 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72  o find and retur
7890: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65  n NULL..*/.Table
78a0: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f   *sqliteTableFro
78b0: 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  mToken(Parse *pP
78c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
78d0: 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  k){.  char *zNam
78e0: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
78f0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
7900: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
7910: 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66  oken(pTok);.  if
7920: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
7930: 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  urn 0;.  pTab = 
7940: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
7950: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
7960: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
7970: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
7980: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
7990: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
79a0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
79b0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
79c0: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
79d0: 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e  pTok->z, pTok->n
79e0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
79f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
7a00: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
7a10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7a20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
7a30: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
7a40: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
7a50: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
7a60: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
7a70: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
7a80: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
7a90: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
7aa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
7ab0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  oken *pName, int
7ac0: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
7ad0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62  e *pTable;.  Vdb
7ae0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
7af0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
7b00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
7b10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
7b20: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
7b30: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
7b40: 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  n;.  pTable = sq
7b50: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
7b60: 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  en(pParse, pName
7b70: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7b80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7b90: 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f  f( pTable->readO
7ba0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
7bb0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
7bc0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
7bd0: 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ble ", pTable->z
7be0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20  Name, .       " 
7bf0: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
7c00: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
7c10: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7c20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c30: 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
7c40: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ble->pSelect==0 
7c50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7c60: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7c70: 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52  zErrMsg, "use DR
7c80: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
7c90: 74 65 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20  te table ",.    
7ca0: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c    pTable->zName,
7cb0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7cc0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
7cd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
7ce0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65  isView && pTable
7cf0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
7d00: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
7d10: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
7d20: 67 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  g, "use DROP VIE
7d30: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
7d40: 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65   ",.      pTable
7d50: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
7d60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7d70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7d80: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
7d90: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
7da0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
7db0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
7dc0: 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
7dd0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
7de0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
7df0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
7e00: 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70  atic VdbeOp drop
7e10: 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  Table[] = {.    
7e20: 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65    { OP_OpenWrite
7e30: 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20  ,  0, 2,        
7e40: 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20  MASTER_NAME},.  
7e50: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
7e60: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
7e70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7e80: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
7e90: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7ea0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   2 */.      { OP
7eb0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
7ec0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
7ed0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
7ee0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
7ef0: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
7f00: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
7f10: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
7f20: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7f30: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
7f40: 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(8),  0},.  
7f50: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
7f60: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7f70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7f80: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
7f90: 41 44 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(4),  0}, /*
7fa0: 20 38 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   8 */.      { OP
7fb0: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20  _Integer,    0, 
7fc0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7fd0: 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   9 */.      { OP
7fe0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  _SetCookie,  0, 
7ff0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
8000: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
8010: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
8020: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
8030: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8040: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
8050: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
8060: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
8070: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  able->isTemp ){.
8080: 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c        base = sql
8090: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
80a0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
80b0: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
80c0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
80d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
80e0: 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c 65  , base+2, pTable
80f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
8100: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
8110: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
8120: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
8130: 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78   base+9, db->nex
8140: 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  t_cookie);.    }
8150: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
8160: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8180: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
8190: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
81a0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  sTemp);.      fo
81b0: 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70  r(pIdx=pTable->p
81c0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
81d0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
81e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
81f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
8200: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
8210: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
8220: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
8230: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  }.    sqliteEndW
8240: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8250: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
8260: 20 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20   Move the table 
8270: 28 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64  (and all its ind
8280: 69 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e  ices) to the pen
8290: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e  ding DROP queue.
82a0: 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
82b0: 20 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72   table was never
82c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74   committed, just
82d0: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20   delete it.  If 
82e0: 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
82f0: 61 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  as been committe
8300: 64 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20  d and is placed 
8310: 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  on the pending D
8320: 52 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20  ROP queue, then 
8330: 74 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  the.  ** delete 
8340: 77 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20  will occur when 
8350: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
8360: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78  rnalChanges() ex
8370: 65 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ecutes..  **.  *
8380: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
8390: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
83a0: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
83b0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
83c0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
83d0: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
83e0: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
83f0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
8400: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
8410: 50 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65  PendingDropTable
8420: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
8430: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
8440: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
8450: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
8460: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
8470: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
8480: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
8490: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
84a0: 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20    pIndex is the 
84b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
84c0: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65  x .** and pTable
84d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
84e0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
84f0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
8500: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
8510: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
8520: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
8530: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
8540: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
8550: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
8560: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
8570: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
8580: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
8590: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
85a0: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
85b0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
85c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
85d0: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
85e0: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
85f0: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8600: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
8610: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
8620: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
8630: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
8640: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
8650: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
8660: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
8670: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
8680: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
8690: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
86a0: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
86b0: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
86c0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
86d0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
86e0: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
86f0: 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a  iteCreateIndex(.
8700: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8710: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
8720: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
8730: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
8740: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
8750: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
8760: 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  x.  May be NULL 
8770: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
8780: 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  le,   /* Name of
8790: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e   the table to in
87a0: 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65  dex.  Use pParse
87b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
87c0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c   */.  IdList *pL
87d0: 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
87e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
87f0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
8800: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
8810: 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
8820: 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
8830: 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
8840: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
8850: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
8860: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
8870: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
8880: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
8890: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
88a0: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
88b0: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
88c0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
88d0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
88e0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
88f0: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
8900: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
8910: 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54   *pIndex;   /* T
8920: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
8930: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
8940: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
8950: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
8960: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
8970: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
8980: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
8990: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c  ID list */.  sql
89a0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
89b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65  ->db;.  int hide
89c0: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
89d0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20    /* Do not put 
89e0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
89f0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
8a00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8a10: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
8a20: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
8a30: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
8a40: 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
8a50: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
8a60: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
8a70: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
8a80: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
8a90: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
8aa0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61  able!=0 ){.    a
8ab0: 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20  ssert( pName!=0 
8ac0: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73  );.    pTab =  s
8ad0: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
8ae0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ken(pParse, pTab
8af0: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
8b00: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
8b10: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
8b20: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
8b30: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
8b40: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
8b50: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
8b60: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
8b70: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
8b80: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
8b90: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
8ba0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8bb0: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
8bc0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
8bd0: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20  ay not have new 
8be0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
8bf0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
8c00: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
8c10: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
8c20: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
8c30: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
8c40: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8c50: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8c60: 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20  Msg, "views may 
8c70: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
8c80: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
8c90: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
8ca0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
8cb0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
8cc0: 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
8cd0: 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65  created while re
8ce0: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68  -reading the sch
8cf0: 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ema from sqlite_
8d00: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20  master.  ** but 
8d10: 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  the table associ
8d20: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8d30: 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72  ndex is a tempor
8d40: 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61  ary table, it ca
8d50: 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e  n.  ** only mean
8d60: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
8d70: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8d80: 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69  is really associ
8d90: 61 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a  ated with is.  *
8da0: 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65  * one whose name
8db0: 20 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e   is hidden behin
8dc0: 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  d a temporary ta
8dd0: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
8de0: 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e  e name..  ** Sin
8df0: 63 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73  ce its table has
8e00: 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64   been suppressed
8e10: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73  , we need to als
8e20: 6f 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20  o suppress the. 
8e30: 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   ** index..  */.
8e40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
8e50: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d 3e  itFlag && pTab->
8e60: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f  isTemp ){.    go
8e70: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
8e80: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
8e90: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
8ea0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
8eb0: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
8ec0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
8ed0: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
8ee0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
8ef0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
8f00: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
8f10: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
8f20: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
8f30: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
8f40: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
8f50: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
8f60: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
8f70: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
8f80: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
8f90: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
8fa0: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
8fb0: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
8fc0: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
8fd0: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
8fe0: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
8ff0: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
9000: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
9010: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
9020: 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20  ex, but we will 
9030: 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69  not.  ** store i
9040: 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68  ts name in the h
9050: 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20  ash table.  Set 
9060: 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61  the hideName fla
9070: 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a  g to accomplish.
9080: 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a    ** this..  **.
9090: 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
90a0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
90b0: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
90c0: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
90d0: 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
90e0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
90f0: 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
9100: 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
9110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
9120: 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  me ){.    Index 
9130: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
9140: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
9150: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
9160: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
9170: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
9180: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
9190: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
91a0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
91b0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
91c0: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
91d0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
91e0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
91f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9200: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
9210: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
9220: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
9230: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
9240: 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d   if( pISameName-
9250: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
9260: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
9270: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
9280: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
9290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
92b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
92c0: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
92d0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
92e0: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
92f0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  s", 0);.        
9300: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9310: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
9320: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9340: 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d    if( (pTSameNam
9350: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
9360: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  ble(db, zName))!
9370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9380: 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65  pTSameName->isTe
9390: 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  mp && pParse->in
93a0: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  itFlag ){.      
93b0: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a    hideName = 1;.
93c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
93d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
93e0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
93f0: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
9400: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
9410: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
9420: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
9430: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9440: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
9450: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9460: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
9470: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9480: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
9490: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
94a0: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
94b0: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
94c0: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
94d0: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
94e0: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
94f0: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
9500: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
9510: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
9520: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9530: 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61  &zName, "(", pTa
9540: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f  b->zName, " auto
9550: 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30  index ", zBuf, 0
9560: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
9570: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9580: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9590: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c    hideName = sql
95a0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
95b0: 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a   zName)!=0;.  }.
95c0: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
95d0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
95e0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
95f0: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
9600: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
9610: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
9620: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
9630: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
9640: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
9650: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
9660: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
9670: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
9680: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
9690: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
96a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
96b0: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
96c0: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
96d0: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
96e0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
96f0: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
9700: 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
9710: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
9720: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9730: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
9740: 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
9750: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
9760: 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
9770: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
9780: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
9790: 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
97a0: 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69   sizeof(int)*pLi
97d0: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
97e0: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
97f0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9800: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
9810: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
9820: 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49  &pIndex[1];.  pI
9830: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
9840: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
9850: 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49  Column[pList->nI
9860: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
9870: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
9880: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
9890: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
98a0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
98b0: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70   pList->nId;.  p
98c0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
98d0: 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75   pIndex->isUniqu
98e0: 65 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20  e = onError;..  
98f0: 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
9900: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
9910: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
9920: 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
9930: 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
9940: 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
9950: 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
9960: 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
9970: 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
9980: 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
9990: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
99a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
99b0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
99c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
99d0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
99e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
99f0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9a00: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9a10: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
9a20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9a30: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
9a40: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
9a50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
9a60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
9a70: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
9a80: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
9a90: 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e   " has no column
9aa0: 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d   named ", pList-
9ab0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
9ac0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9ad0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
9ae0: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
9af0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
9b00: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
9b10: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
9b20: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
9b30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
9b40: 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
9b50: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
9b60: 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
9b70: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
9b80: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
9b90: 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
9ba0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
9bb0: 65 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65  explain && !hide
9bc0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65  Name ){.    Inde
9bd0: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
9be0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
9bf0: 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e  db->idxHash, pIn
9c00: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
9c10: 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  en(zName)+1, pIn
9c20: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
9c30: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9c40: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
9c50: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
9c60: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
9c70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
9c80: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
9c90: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9ca0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
9cb0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
9cc0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
9cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
9ce0: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
9cf0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
9d00: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
9d10: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
9d20: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
9d30: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
9d40: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
9d50: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
9d60: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
9d70: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
9d80: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
9d90: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
9da0: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
9db0: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
9dc0: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
9dd0: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
9de0: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
9df0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
9e00: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
9e10: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
9e20: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
9e30: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
9e40: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
9e50: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
9e60: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
9e70: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
9e80: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
9e90: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
9ea0: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
9eb0: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
9ec0: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
9ed0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
9ee0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
9ef0: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
9f00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
9f10: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
9f20: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
9f30: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
9f40: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
9f50: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9f60: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
9f70: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
9f80: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
9f90: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
9fa0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
9fb0: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
9fc0: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
9fd0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
9fe0: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
9ff0: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
a000: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
a010: 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20  ag && pTable!=0 
a020: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
a030: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
a040: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
a050: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
a060: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
a070: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
a080: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
a090: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
a0a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
a0b0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a0c0: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
a0d0: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
a0e0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
a0f0: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
a100: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e    **.  ** The in
a110: 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e  itFlag is 0 when
a120: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
a130: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
a140: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
a150: 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c  and.  The initFl
a160: 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  ag is 1 when a d
a170: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
a180: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
a190: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
a1a0: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
a1b0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
a1c0: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
a1d0: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
a1e0: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
a1f0: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
a200: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
a210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
a220: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
a230: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
a240: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
a250: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
a260: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
a270: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
a280: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
a290: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
a2a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a2b0: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
a2c0: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
a2d0: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
a2e0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
a2f0: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
a300: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
a310: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
a320: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
a330: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
a340: 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a  >initFlag==0 ){.
a350: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
a360: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
a370: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
a380: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
a390: 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 54  ddr;.    int isT
a3a0: 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  emp = pTab->isTe
a3b0: 6d 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  mp;..    v = sql
a3c0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
a3d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
a3e0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
a3f0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
a400: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
a410: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
a420: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
a430: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
a440: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
a450: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a460: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
a470: 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20  Write, 0, 2);.  
a480: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a490: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
a4a0: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f  MASTER_NAME, P3_
a4b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
a4c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
a4d0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
a4e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a4f0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
a500: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a510: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a520: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
a530: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a540: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a550: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
a560: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
a570: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a580: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
a590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a5a0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a5b0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
a5c0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a5e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
a5f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a600: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a610: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
a620: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
a630: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
a640: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
a650: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
a660: 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  dex, 0, isTemp);
a670: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
a680: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
a690: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
a6a0: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
a6b0: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
a6c0: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
a6d0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
a6e0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
a6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a700: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a710: 65 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a  enWrAux, 1, 0);.
a720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a730: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a740: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a750: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
a760: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a770: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
a780: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
a790: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
a7a0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64  Temp ){.      ad
a7b0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
a7c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a7d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
a7e0: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
a7f0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  nd ){.        n 
a800: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
a810: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
a820: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73  ) + 1;.        s
a830: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
a840: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
a850: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t->z, n);.      
a860: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
a870: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
a880: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
a890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
a8a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
a8b0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
a8c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
a8d0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
a8e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a8f0: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
a900: 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32  Aux : OP_Open, 2
a910: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
a920: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a930: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
a940: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
a950: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62  TATIC);.      lb
a960: 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l2 = sqliteVdbeM
a970: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a980: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a990: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
a9a0: 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
a9b0: 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
a9c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
a9d0: 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cno, 2, 0);.    
a9e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
a9f0: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
aa00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
aa10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
aa20: 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e  P_Column, 2, pIn
aa30: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
aa40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
aa50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
aa60: 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  (v, OP_MakeIdxKe
aa70: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  y, pIndex->nColu
aa80: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mn, 0);.      sq
aa90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aaa0: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
aab0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
aac0: 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20  OE_None);.      
aad0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aae0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
aaf0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
ab00: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
ab10: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
ab20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ab30: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ab40: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
ab50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ab60: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
ab70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ab80: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
ab90: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
aba0: 0a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 43  .        changeC
abb0: 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20  ookie(db);.     
abc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
abd0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
abe0: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
abf0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
ac00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ac10: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
ac20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
ac30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ac40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
ac50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ac60: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
ac70: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
ac80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ac90: 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
aca0: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
acb0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
acc0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
acd0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
ace0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
acf0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ad00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ad10: 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
ad20: 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
ad30: 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
ad40: 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
ad50: 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
ad60: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
ad70: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64  id sqliteDropInd
ad80: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
ad90: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
ada0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
adb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
adc0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
add0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
ade0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
adf0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
ae00: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
ae10: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  ed ) return;.  z
ae20: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
ae30: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
ae40: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
ae50: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
ae60: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
ae70: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
ae80: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
ae90: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
aea0: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
aeb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
aec0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
aed0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
aee0: 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20  index: ", 0, .  
aef0: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20        pName->z, 
af00: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
af10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
af20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
af30: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
af40: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
af50: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
af60: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
af70: 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
af80: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
af90: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
afa0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
afb0: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
afc0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
afd0: 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20  Write,  0, 2,   
afe0: 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d      MASTER_NAME}
aff0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  ,.      { OP_Rew
b000: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
b010: 28 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20 20 20  (10),0}, .      
b020: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
b030: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b040: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 2 */.      {
b050: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
b060: 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  1, 1,       0},.
b070: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
b080: 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
b090: 20 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20     0}, /* 4 */. 
b0a0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b0b0: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
b0c0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
b0d0: 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
b0e0: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
b0f0: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
b100: 20 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20      0, ADDR(4), 
b110: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
b120: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
b130: 44 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20 20 20  DR(10),0},.     
b140: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
b150: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
b160: 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20  , /* 9 */.      
b170: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
b180: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b190: 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20   /* 10 */.      
b1a0: 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  { OP_SetCookie, 
b1b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b1c0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
b1d0: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20  e,      0, 0,   
b1e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
b1f0: 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20     int base;.   
b200: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
b210: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a  Index->pTable;..
b220: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
b230: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
b240: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  arse);.    if( !
b250: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  pTab->isTemp ){.
b260: 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c        base = sql
b270: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
b280: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
b290: 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e  opIndex), dropIn
b2a0: 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dex);.      sqli
b2b0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b2c0: 2c 20 62 61 73 65 2b 32 2c 20 70 49 6e 64 65 78  , base+2, pIndex
b2d0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
b2e0: 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  IC);.      chang
b2f0: 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20  eCookie(db);.   
b300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b310: 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 31 30  ngeP1(v, base+10
b320: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
b330: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
b340: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b350: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e   OP_Destroy, pIn
b360: 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  dex->tnum, pTab-
b370: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  >isTemp);.    sq
b380: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
b390: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
b3a0: 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68   }..  /* Move th
b3b0: 65 20 69 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65  e index onto the
b3c0: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75   pending DROP qu
b3d0: 65 75 65 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  eue.  Or, if the
b3e0: 20 69 6e 64 65 78 20 77 61 73 0a 20 20 2a 2a 20   index was.  ** 
b3f0: 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65 64 2c  never committed,
b400: 20 6a 75 73 74 20 64 65 6c 65 74 65 20 69 74 2e   just delete it.
b410: 20 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65    Indices on the
b420: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75   pending DROP qu
b430: 65 75 65 0a 20 20 2a 2a 20 67 65 74 20 64 65 6c  eue.  ** get del
b440: 65 74 65 64 20 62 79 20 73 71 6c 69 74 65 43 6f  eted by sqliteCo
b450: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
b460: 67 65 73 28 29 20 77 68 65 6e 20 74 68 65 20 75  ges() when the u
b470: 73 65 72 20 65 78 65 63 75 74 65 73 0a 20 20 2a  ser executes.  *
b480: 2a 20 61 20 43 4f 4d 4d 49 54 2e 20 20 4f 72 20  * a COMMIT.  Or 
b490: 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
b4a0: 63 75 72 73 2c 20 74 68 65 20 65 6c 65 6d 65 6e  curs, the elemen
b4b0: 74 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20 71  ts of the DROP q
b4c0: 75 65 75 65 0a 20 20 2a 2a 20 61 72 65 20 6d 6f  ueue.  ** are mo
b4d0: 76 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ved back into th
b4e0: 65 20 6d 61 69 6e 20 68 61 73 68 20 74 61 62 6c  e main hash tabl
b4f0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
b500: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
b510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e 64  {.    sqlitePend
b520: 69 6e 67 44 72 6f 70 49 6e 64 65 78 28 64 62 2c  ingDropIndex(db,
b530: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
b540: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b550: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
b570: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
b580: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
b590: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
b5a0: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
b5b0: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
b5c0: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
b5d0: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
b5e0: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
b5f0: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
b600: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
b610: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
b620: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
b630: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
b640: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
b650: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
b660: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
b670: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
b680: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b690: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
b6a0: 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a  >nId & 7)==0 ){.
b6b0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
b6c0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
b6d0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
b6e0: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
b6f0: 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66  t->nId+8)*sizeof
b700: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
b710: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
b720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
b730: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
b740: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
b750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
b760: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
b770: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
b780: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c  [pList->nId], 0,
b790: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
b7a0: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
b7b0: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
b7c0: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
b7d0: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
b7e0: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
b7f0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f  tNString(pz, pTo
b800: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
b810: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
b820: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
b830: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b840: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
b850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
b860: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b870: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
b880: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
b890: 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
b8a0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
b8b0: 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
b8c0: 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
b8d0: 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
b8e0: 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
b8f0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
b900: 74 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73  teIdListAddAlias
b910: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
b920: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
b930: 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
b940: 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20  List->nId>0 ){. 
b950: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
b960: 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73  ->nId - 1;.    s
b970: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
b980: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
b990: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
b9a0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
b9b0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
b9c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
b9d0: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
b9e0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
b9f0: 69 72 65 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76  ire IdList..*/.v
ba00: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
ba10: 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
ba20: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
ba30: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ba40: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
ba50: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
ba60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
ba70: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
ba80: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
ba90: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
baa0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  >a[i].zAlias);. 
bab0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
bac0: 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74  i].pTab && pList
bad0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54  ->a[i].pTab->isT
bae0: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
baf0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
bb00: 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b  ble(0, pList->a[
bb10: 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  i].pTab);.    }.
bb20: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
bb30: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
bb40: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  i].pSelect);.  }
bb50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
bb60: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
bb70: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
bb80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20  ./*.** The COPY 
bb90: 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63  command is for c
bba0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
bbb0: 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64  h PostgreSQL and
bbc0: 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a   specificially.*
bbd0: 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74  * for the abilit
bbe0: 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  y to read the ou
bbf0: 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e  tput of pg_dump.
bc00: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20    The format is 
bc10: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  as.** follows:.*
bc20: 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62  *.**    COPY tab
bc30: 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53  le FROM file [US
bc40: 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73  ING DELIMITERS s
bc50: 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61  tring].**.** "ta
bc60: 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74  ble" is an exist
bc70: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ing table name. 
bc80: 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69   We will read li
bc90: 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d  nes of code from
bca0: 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c  .** file to fill
bcb0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68   this table with
bcc0: 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67   data.  File mig
bcd0: 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20  ht be "stdin".  
bce0: 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20  The optional.** 
bcf0: 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67  delimiter string
bd00: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
bd10: 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73  field separators
bd20: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
bd30: 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64  s a tab..*/.void
bd40: 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50   sqliteCopy(.  P
bd50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bd60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
bd70: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
bd80: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
bd90: 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20  ,   /* The name 
bda0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
bdb0: 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  o which we will 
bdc0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65  insert */.  Toke
bdd0: 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20  n *pFilename,   
bde0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
bdf0: 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69  m which to obtai
be00: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  n information */
be10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d  .  Token *pDelim
be20: 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20 74  iter,   /* Use t
be30: 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64  his as the field
be40: 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20 20   delimiter */.  
be50: 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20 20  int onError     
be60: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
be70: 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61 69  do if a constrai
be80: 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20  nt fails */.){. 
be90: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
bea0: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e  char *zTab;.  in
beb0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  t i;.  Vdbe *v;.
bec0: 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b    int addr, end;
bed0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
bee0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
bef0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54  Parse->db;..  zT
bf00: 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  ab = sqliteTable
bf10: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
bf20: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ableName);.  if(
bf30: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
bf40: 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30  ailed || zTab==0
bf50: 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65   ) goto copy_cle
bf60: 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20 73  anup;.  pTab = s
bf70: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f  qliteTableNameTo
bf80: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a 54  Table(pParse, zT
bf90: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ab);.  sqliteFre
bfa0: 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 70  e(zTab);.  if( p
bfb0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f  Tab==0 ) goto co
bfc0: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 76 20  py_cleanup;.  v 
bfd0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
bfe0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
bff0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e   ){.    int open
c000: 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65  Op;.    sqliteBe
c010: 67 69 6e 4d 75 6c 74 69 57 72 69 74 65 4f 70 65  ginMultiWriteOpe
c020: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
c030: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c040: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c050: 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29  _FileOpen, 0, 0)
c060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c070: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
c080: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20  , pFilename->z, 
c090: 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20  pFilename->n);. 
c0a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
c0b0: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
c0c0: 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54  .    openOp = pT
c0d0: 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f  ab->isTemp ? OP_
c0e0: 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f  OpenWrAux : OP_O
c0f0: 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71  penWrite;.    sq
c100: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c110: 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62   openOp, 0, pTab
c120: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
c130: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c140: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
c150: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
c160: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
c170: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c180: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c190: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
c1a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c1b0: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69  dOp(v, openOp, i
c1c0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
c1d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
c1e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
c1f0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
c200: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
c210: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
c220: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
c230: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
c240: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c250: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
c260: 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
c270: 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a   the row count *
c280: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20  /.    }.    end 
c290: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
c2a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64  Label(v);.    ad
c2b0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
c2c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52  ddOp(v, OP_FileR
c2d0: 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ead, pTab->nCol,
c2e0: 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70   end);.    if( p
c2f0: 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20  Delimiter ){.   
c300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c310: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
c320: 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44  Delimiter->z, pD
c330: 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20  elimiter->n);.  
c340: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
c350: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
c360: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c370: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c380: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22  ngeP3(v, addr, "
c390: 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  \t", 1);.    }. 
c3a0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b     if( pTab->iPK
c3b0: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ey>=0 ){.      s
c3c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c3d0: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
c3e0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29   pTab->iPKey, 0)
c3f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
c400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
c410: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
c420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c430: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c440: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
c450: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
c460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
c470: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
c480: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
c490: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
c4a0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
c4b0: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  r primary key co
c4c0: 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77  lumn is filled w
c4d0: 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69  ith NULL since i
c4e0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  ts.        ** va
c4f0: 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75  lue is always pu
c500: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  lled from the re
c510: 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  cord number */. 
c520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
c530: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
c540: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
c550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c560: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c570: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
c580: 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, i, 0);.      
c590: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c5a0: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
c5b0: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
c5c0: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30  e, pTab, 0, 0, 0
c5d0: 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64  , 0, onError, ad
c5e0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  dr);.    sqliteC
c5f0: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
c600: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
c610: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
c620: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
c630: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
c640: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)!=0 ){.      s
c650: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c660: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
c670: 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  0);  /* Incremen
c680: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
c690: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
c6a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
c6b0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
c6c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
c6d0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
c6e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
c6f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
c700: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
c710: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
c720: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
c730: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
c740: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
c750: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
c760: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c770: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
c780: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
c790: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c7a0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30  OP_ColumnName, 0
c7b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c7c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
c7d0: 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65  , -1, "rows inse
c7e0: 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43  rted", P3_STATIC
c7f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
c810: 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a  allback, 1, 0);.
c820: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70      }.  }.  .cop
c830: 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74  y_cleanup:.  ret
c840: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
c850: 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56  e non-standard V
c860: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73  ACUUM command is
c870: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
c880: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  p the database,.
c890: 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65  ** collapse free
c8a0: 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74   space, etc.  It
c8b0: 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74   is modelled aft
c8c0: 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f  er the VACUUM co
c8d0: 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74  mmand.** in Post
c8e0: 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e  greSQL..**.** In
c8f0: 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20 6f   version 1.0.x o
c900: 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56 41  f SQLite, the VA
c910: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f 75  CUUM command wou
c920: 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f  ld call.** gdbm_
c930: 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e 20  reorganize() on 
c940: 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  all the database
c950: 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62 65   tables.  But be
c960: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
c970: 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e 6f  2.0.0, SQLite no
c980: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44 42   longer uses GDB
c990: 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e  M so this comman
c9a0: 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65 20  d has.** become 
c9b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64  a no-op..*/.void
c9c0: 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61   sqliteVacuum(Pa
c9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
c9e0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b  en *pTableName){
c9f0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
ca00: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   */.}../*.** Beg
ca10: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
ca20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
ca30: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
ca40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ca50: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
ca60: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
ca70: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
ca80: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
ca90: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
caa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
cab0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
cac0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
cad0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
cae0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
caf0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
cb00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
cb10: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
cb20: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
cb30: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
cb40: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
cb50: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  db->onError = on
cb60: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
cb70: 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
cb80: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
cb90: 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  iteCommitTransac
cba0: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
cbb0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
cbc0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
cbd0: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
cbe0: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
cbf0: 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  >pBe==0 ) return
cc00: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
cc10: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
cc20: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
cc30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
cc40: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
cc50: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72  _InTrans)==0 ) r
cc60: 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61  eturn;.  db->fla
cc70: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
cc80: 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45  Trans;.  sqliteE
cc90: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
cca0: 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e  (pParse);.  db->
ccb0: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
ccc0: 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ault;.}../*.** R
ccd0: 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
cce0: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
ccf0: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  liteRollbackTran
cd00: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
cd10: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
cd20: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
cd30: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
cd40: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
cd50: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  >db)==0 || db->p
cd60: 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Be==0 ) return;.
cd70: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
cd80: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
cd90: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
cda0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
cdb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
cdc0: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74  nTrans)==0 ) ret
cdd0: 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  urn;.  v = sqlit
cde0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
cdf0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
ce00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ce10: 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c  (v, OP_Rollback,
ce20: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62   0, 0);.  }.  db
ce30: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ce40: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62  TE_InTrans;.  db
ce50: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44  ->onError = OE_D
ce60: 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  efault;.}../*.**
ce70: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
ce80: 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
ce90: 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
cea0: 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
ceb0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
cec0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
ced0: 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
cee0: 62 65 20 61 74 6f 6d 69 63 20 69 6e 20 74 68 65  be atomic in the
cef0: 0a 2a 2a 20 73 65 6e 73 65 20 74 68 61 74 20 69  .** sense that i
cf00: 74 20 77 69 6c 6c 20 65 69 74 68 65 72 20 64 6f  t will either do
cf10: 20 69 74 73 20 63 68 61 6e 67 65 73 20 63 6f 6d   its changes com
cf20: 70 6c 65 74 65 6c 79 20 6f 72 20 6e 6f 74 20 61  pletely or not a
cf30: 74 0a 2a 2a 20 61 6c 6c 2e 20 20 53 6f 20 74 68  t.** all.  So th
cf40: 65 72 65 20 69 73 20 6e 6f 74 20 6e 65 65 64 20  ere is not need 
cf50: 74 6f 20 73 65 74 20 61 20 63 68 65 63 6b 70 6f  to set a checkpo
cf60: 69 6e 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  int is a transac
cf70: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 6c 72 65 61  tion.** is alrea
cf80: 64 79 20 69 6e 20 65 66 66 65 63 74 2e 0a 2a 2f  dy in effect..*/
cf90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69  .void sqliteBegi
cfa0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
cfb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
cfc0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d    Vdbe *v;.  v =
cfd0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
cfe0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
cff0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
d000: 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
d010: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
d020: 6e 54 72 61 6e 73 29 3d 3d 30 20 20 29 7b 0a 20  nTrans)==0  ){. 
d030: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d040: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
d050: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
d060: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d070: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
d080: 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d  kie, pParse->db-
d090: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20  >schema_cookie, 
d0a0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
d0b0: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
d0c0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
d0d0: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
d0e0: 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
d0f0: 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
d100: 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
d110: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
d120: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
d130: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69 67 68 74   operation might
d140: 20 6e 6f 74 20 62 65 20 61 74 6f 6d 69 63 20 69   not be atomic i
d150: 6e 0a 2a 2a 20 74 68 65 20 73 65 6e 73 65 20 74  n.** the sense t
d160: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6d 61 79  hat an error may
d170: 20 62 65 20 64 69 73 63 6f 76 65 72 65 64 20 61   be discovered a
d180: 6e 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  nd the operation
d190: 20 6d 69 67 68 74 0a 2a 2a 20 61 62 6f 72 74 20   might.** abort 
d1a0: 61 66 74 65 72 20 73 6f 6d 65 20 63 68 61 6e 67  after some chang
d1b0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
d1c0: 65 2e 20 20 49 66 20 77 65 20 61 72 65 20 69 6e  e.  If we are in
d1d0: 20 74 68 65 20 6d 69 64 64 6c 65 20 0a 2a 2a 20   the middle .** 
d1e0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
d1f0: 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 74 73  , then this sets
d200: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 20   a checkpoint.  
d210: 49 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  If we are not in
d220: 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
d230: 6e 2c 20 74 68 65 6e 20 73 74 61 72 74 20 61 20  n, then start a 
d240: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
d250: 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e  void sqliteBegin
d260: 4d 75 6c 74 69 57 72 69 74 65 4f 70 65 72 61 74  MultiWriteOperat
d270: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d280: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  e){.  Vdbe *v;. 
d290: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
d2a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
d2b0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
d2c0: 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
d2d0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d2e0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
d2f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
d300: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
d310: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
d320: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d330: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
d340: 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e  Cookie, pParse->
d350: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
d360: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
d370: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
d380: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
d390: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d3a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  dOp(v, OP_Checkp
d3b0: 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  oint, 0, 0);.  }
d3c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
d3d0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
d3e0: 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
d3f0: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
d400: 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
d410: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d420: 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20   is a companion 
d430: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69  function to Begi
d440: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
d450: 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  )..** If a trans
d460: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
d470: 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ed, then commit 
d480: 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70  it.  If a checkp
d490: 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72  oint was.** star
d4a0: 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ted then commit 
d4b0: 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  that..*/.void sq
d4c0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
d4d0: 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
d4e0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
d4f0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
d500: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d510: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
d520: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
d530: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
d540: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
d550: 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67     /* Do Nothing
d560: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
d570: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d580: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
d590: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , 0);.  }.}.../*
d5a0: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
d5b0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
d5c0: 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
d5d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d5e0: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72   getBoolean(char
d5f0: 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *z){.  static c
d600: 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20  har *azTrue[] = 
d610: 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22  { "yes", "on", "
d620: 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69  true" };.  int i
d630: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20  ;.  if( z[0]==0 
d640: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d650: 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20  ( isdigit(z[0]) 
d660: 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  || (z[0]=='-' &&
d670: 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20   isdigit(z[1])) 
d680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74  ){.    return at
d690: 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  oi(z);.  }.  for
d6a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
d6b0: 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a  zTrue)/sizeof(az
d6c0: 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  True[0]); i++){.
d6d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
d6e0: 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69  rICmp(z,azTrue[i
d6f0: 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
d700: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
d720: 73 73 20 61 20 70 72 61 67 6d 61 20 73 74 61 74  ss a pragma stat
d730: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50  ement.  .**.** P
d740: 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68  ragmas are of th
d750: 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  is form:.**.**  
d760: 20 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d 20      PRAGMA id = 
d770: 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  value.**.** The 
d780: 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74  identifier might
d790: 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e   also be a strin
d7a0: 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  g.  The value is
d7b0: 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a   a string, and.*
d7c0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72  * identifier, or
d7d0: 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d   a number.  If m
d7e0: 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65  inusFlag is true
d7f0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
d800: 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20   is.** a number 
d810: 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65  that was precede
d820: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
d830: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
d840: 65 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70  ePragma(Parse *p
d850: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c  Parse, Token *pL
d860: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
d870: 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61  ht, int minusFla
d880: 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66  g){.  char *zLef
d890: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
d8a0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Right = 0;.  sql
d8b0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
d8c0: 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d  ->db;..  zLeft =
d8d0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
d8e0: 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e  Left->z, pLeft->
d8f0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
d900: 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66  ote(zLeft);.  if
d910: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
d920: 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20     zRight = 0;. 
d930: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
d940: 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22  ing(&zRight, "-"
d950: 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20  , 1, pRight->z, 
d960: 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20  pRight->n, 0);. 
d970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67   }else{.    zRig
d980: 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ht = sqliteStrND
d990: 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52  up(pRight->z, pR
d9a0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  ight->n);.    sq
d9b0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67  liteDequote(zRig
d9c0: 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a  ht);.  }. .  /*.
d9d0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
d9e0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
d9f0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
da00: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d  ault_cache_size=
da10: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
da20: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
da30: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ts the current p
da40: 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e  ersistent settin
da50: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
da60: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
da70: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
da80: 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ned is the maxim
da90: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
daa0: 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  * pages in the p
dab0: 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  age cache.  The 
dac0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
dad0: 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e   both the curren
dae0: 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  t.  ** page cach
daf0: 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64  e size value and
db00: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
db10: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
db20: 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65  value.  ** store
db30: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
db40: 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e file..  **.  *
db50: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 61  * The default ca
db60: 63 68 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72  che size is stor
db70: 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65  ed in meta-value
db80: 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20   2 of page 1 of 
db90: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
dba0: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63  e file.  The cac
dbb0: 68 65 20 73 69 7a 65 20 69 73 20 61 63 74 75 61  he size is actua
dbc0: 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65  lly the absolute
dbd0: 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74   value of.  ** t
dbe0: 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  his memory locat
dbf0: 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f  ion.  The sign o
dc00: 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64  f meta-value 2 d
dc10: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20  etermines the.  
dc20: 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  ** synchronous s
dc30: 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74  etting.  A negat
dc40: 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20  ive value means 
dc50: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
dc60: 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f  ff.  ** and a po
dc70: 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61  sitive value mea
dc80: 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ns synchronous i
dc90: 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s on..  */.  if(
dca0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
dcb0: 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 63 61  Left,"default_ca
dcc0: 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  che_size")==0 ){
dcd0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
dce0: 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  Op getCacheSize[
dcf0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
dd00: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c  _ReadCookie,  0,
dd10: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
dd20: 20 20 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c       { OP_AbsVal
dd30: 75 65 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  ue,    0, 0,    
dd40: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
dd50: 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20  OP_Dup,         
dd60: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
dd70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
dd80: 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
dd90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
dda0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
ddb0: 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30    0, 6,        0
ddc0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
ddd0: 74 65 67 65 72 2c 20 20 20 20 20 4d 41 58 5f 50  teger,     MAX_P
dde0: 41 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20  AGES,0, 0},.    
ddf0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
de00: 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20  nt, 1, 0,       
de10: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
de20: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
de30: 30 2c 20 20 20 20 20 20 20 20 22 63 61 63 68 65  0,        "cache
de40: 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b  _size"},.      {
de50: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
de60: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
de70: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
de80: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
de90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
dea0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
deb0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69  urn;.    if( pRi
dec0: 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
ded0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dee0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
def0: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61   ArraySize(getCa
df00: 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63  cheSize), getCac
df10: 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  heSize);.    }el
df20: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  se{.      int ad
df30: 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  dr;.      int si
df40: 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74  ze = atoi(zRight
df50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
df60: 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  e<0 ) size = -si
df70: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
df80: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
df90: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
dfa0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
dfb0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
dfc0: 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  , size, 0);.    
dfd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dfe0: 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  p(v, OP_ReadCook
dff0: 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  ie, 0, 2);.     
e000: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
e010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
e020: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
e030: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e040: 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c  dOp(v, OP_Ge, 0,
e050: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
e060: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e070: 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20  v, OP_Negative, 
e080: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
e090: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e0a0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
e0b0: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
e0c0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
e0d0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
e0e0: 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65    db->cache_size
e0f0: 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a   = db->cache_siz
e100: 65 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69  e<0 ? -size : si
e110: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
e120: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
e130: 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63  e(db->pBe, db->c
e140: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
e150: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a  }.  }else..  /*.
e160: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
e170: 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
e180: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d  AGMA cache_size=
e190: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
e1a0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
e1b0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ts the current l
e1c0: 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72  ocal setting for
e1d0: 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63   the.  ** page c
e1e0: 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20  ache size.  The 
e1f0: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 63 61  local setting ca
e200: 6e 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66  n be different f
e210: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  rom.  ** the per
e220: 73 69 73 74 65 6e 74 20 63 61 63 68 65 20 73 69  sistent cache si
e230: 7a 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 73  ze value that is
e240: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
e250: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
e260: 65 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20 76  e itself.  The v
e270: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
e280: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
e290: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
e2a0: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
e2b0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
e2c0: 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c   form sets the l
e2d0: 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63  ocal.  ** page c
e2e0: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e  ache size value.
e2f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68    It does not ch
e300: 61 6e 67 65 20 74 68 65 20 70 65 72 73 69 73 74  ange the persist
e310: 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65 20 73  ent.  ** cache s
e320: 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  ize stored on th
e330: 65 20 64 69 73 6b 20 73 6f 20 74 68 65 20 63 61  e disk so the ca
e340: 63 68 65 20 73 69 7a 65 20 77 69 6c 6c 20 72 65  che size will re
e350: 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73  vert.  ** to its
e360: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
e370: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
e380: 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72   is closed and r
e390: 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20  eopened..  ** N 
e3a0: 73 68 6f 75 6c 64 20 62 65 20 61 20 70 6f 73 69  should be a posi
e3b0: 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20  tive integer..  
e3c0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
e3d0: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61  trICmp(zLeft,"ca
e3e0: 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  che_size")==0 ){
e3f0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
e400: 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  Op getCacheSize[
e410: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
e420: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
e430: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
e440: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
e450: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
e460: 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22      "cache_size"
e470: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
e480: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
e490: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
e4a0: 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
e4b0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
e4c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
e4d0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e4e0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
e4f0: 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
e500: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
e510: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a  b->cache_size;;.
e520: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
e530: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
e540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e550: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
e560: 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
e570: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e580: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e590: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
e5a0: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
e5b0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
e5c0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
e5d0: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
e5e0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
e5f0: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
e600: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61        if( db->ca
e610: 63 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a  che_size<0 ) siz
e620: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
e630: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
e640: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
e650: 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
e660: 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64  eSize(db->pBe, d
e670: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
e680: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
e690: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
e6a0: 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f   default_synchro
e6b0: 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41 47 4d  nous.  **  PRAGM
e6c0: 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72  A default_synchr
e6d0: 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20  onous=BOOLEAN.  
e6e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
e6f0: 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73 20 74  t form returns t
e700: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 76 61  he persistent va
e710: 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79 6e 63  lue of the "sync
e720: 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e 67  hronous" setting
e730: 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 74  .  ** that is st
e740: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
e750: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 74  base.  This is t
e760: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  he synchronous s
e770: 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a  etting that.  **
e780: 20 69 73 20 75 73 65 64 20 77 68 65 6e 65 76 65   is used wheneve
e790: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  r the database i
e7a0: 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73 20  s opened unless 
e7b0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
e7c0: 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20 22 73  separate.  ** "s
e7d0: 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72 61 67  ynchronous" prag
e7e0: 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ma.  The second 
e7f0: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
e800: 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20   persistent and 
e810: 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73  the.  ** local s
e820: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
e830: 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ng to the value 
e840: 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  given..  **.  **
e850: 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   If synchronous 
e860: 69 73 20 6f 6e 2c 20 53 51 4c 69 74 65 20 77 69  is on, SQLite wi
e870: 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  ll do an fsync()
e880: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 74 20   system call at 
e890: 73 74 72 61 74 65 67 69 63 0a 20 20 2a 2a 20 70  strategic.  ** p
e8a0: 6f 69 6e 74 73 20 74 6f 20 69 6e 73 75 72 65 20  oints to insure 
e8b0: 74 68 61 74 20 61 6c 6c 20 70 72 65 76 69 6f 75  that all previou
e8c0: 73 6c 79 20 77 72 69 74 74 65 6e 20 64 61 74 61  sly written data
e8d0: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
e8e0: 65 6e 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  en.  ** written 
e8f0: 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  onto the disk su
e900: 72 66 61 63 65 20 62 65 66 6f 72 65 20 63 6f 6e  rface before con
e910: 74 69 6e 75 69 6e 67 2e 20 20 54 68 69 73 20 6d  tinuing.  This m
e920: 6f 64 65 20 69 6e 73 75 72 65 73 20 74 68 61 74  ode insures that
e930: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
e940: 73 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  se will always b
e950: 65 20 69 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e  e in a consisten
e960: 74 20 73 74 61 74 65 20 65 76 65 6e 74 20 69 66  t state event if
e970: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20   the operating. 
e980: 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68   ** system crash
e990: 65 73 20 6f 72 20 70 6f 77 65 72 20 74 6f 20 74  es or power to t
e9a0: 68 65 20 63 6f 6d 70 75 74 65 72 20 69 73 20 69  he computer is i
e9b0: 6e 74 65 72 72 75 70 74 65 64 20 75 6e 65 78 70  nterrupted unexp
e9c0: 65 63 74 65 64 6c 79 2e 0a 20 20 2a 2a 20 57 68  ectedly..  ** Wh
e9d0: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
e9e0: 73 20 6f 66 66 2c 20 53 51 4c 69 74 65 20 77 69  s off, SQLite wi
e9f0: 6c 6c 20 6e 6f 74 20 77 61 69 74 20 66 6f 72 20  ll not wait for 
ea00: 63 68 61 6e 67 65 73 20 74 6f 20 61 63 74 75 61  changes to actua
ea10: 6c 6c 79 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  lly.  ** be writ
ea20: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
ea30: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
ea40: 67 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 69  g.  As soon as i
ea50: 74 20 68 61 6e 64 73 20 63 68 61 6e 67 65 73 0a  t hands changes.
ea60: 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65 72    ** to the oper
ea70: 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 69 74  ating system, it
ea80: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
ea90: 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 70 65  e changes are pe
eaa0: 72 6d 61 6e 65 6e 74 20 61 6e 64 0a 20 20 2a 2a  rmanent and.  **
eab0: 20 69 74 20 63 6f 6e 74 69 6e 75 65 73 20 67 6f   it continues go
eac0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 62 61  ing.  The databa
ead0: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
eae0: 72 75 70 74 65 64 20 62 79 20 61 20 70 72 6f 67  rupted by a prog
eaf0: 72 61 6d 20 63 72 61 73 68 0a 20 20 2a 2a 20 65  ram crash.  ** e
eb00: 76 65 6e 20 77 69 74 68 20 73 79 6e 63 68 72 6f  ven with synchro
eb10: 6e 6f 75 73 20 6f 66 66 2c 20 62 75 74 20 61 6e  nous off, but an
eb20: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
eb30: 6d 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  m crash or power
eb40: 20 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f 75 6c 64   loss.  ** could
eb50: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63 6f 72   potentially cor
eb60: 72 75 70 74 20 64 61 74 61 2e 20 20 4f 6e 20 74  rupt data.  On t
eb70: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 73  he other hand, s
eb80: 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66 20 69  ynchronous off i
eb90: 73 0a 20 20 2a 2a 20 66 61 73 74 65 72 20 74 68  s.  ** faster th
eba0: 61 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f  an synchronous o
ebb0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  n..  */.  if( sq
ebc0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
ebd0: 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  t,"default_synch
ebe0: 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20  ronous")==0 ){. 
ebf0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
ec00: 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20   getSync[] = {. 
ec10: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
ec20: 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
ec30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
ec40: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
ec50: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
ec60: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
ec70: 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
ec80: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
ec90: 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20  { OP_Lt,        
eca0: 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30    0, 5,        0
ecb0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64  },.      { OP_Ad
ecc0: 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c  dImm,      1, 0,
ecd0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
ece0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
ecf0: 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20  nt, 1, 0,       
ed00: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ed10: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
ed20: 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68  0,        "synch
ed30: 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20  ronous"},.      
ed40: 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
ed50: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
ed60: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
ed70: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
ed80: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ed90: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
eda0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52  turn;.    if( pR
edb0: 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e  ight->z==pLeft->
edc0: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
edd0: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
ede0: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53  , ArraySize(getS
edf0: 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a  ync), getSync);.
ee00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee10: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
ee20: 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e   int size = db->
ee30: 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20  cache_size;.    
ee40: 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
ee50: 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
ee60: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
ee70: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ee80: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
ee90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
eea0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c  P_ReadCookie, 0,
eeb0: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
eec0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
eed0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
eee0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
eef0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ef00: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
ef10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ef20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
ef30: 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  0, addr+3);.    
ef40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ef50: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
ef60: 4d 41 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20  MAX_PAGES, 0);. 
ef70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ef80: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56 61  ddOp(v, OP_AbsVa
ef90: 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  lue, 0, 0);.    
efa0: 20 20 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61    if( !getBoolea
efb0: 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
efc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
efd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
efe0: 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
eff0: 20 20 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65      size = -size
f000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f020: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
f030: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
f040: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
f050: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
f060: 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
f070: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
f080: 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
f090: 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
f0a0: 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
f0b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
f0c0: 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  e..  /*.  **   P
f0d0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
f0e0: 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
f0f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c  synchronous=BOOL
f100: 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  EAN.  **.  ** Re
f110: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
f120: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
f130: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66  he synchronous f
f140: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
f150: 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   ** the local va
f160: 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  lue does not mak
f170: 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
f180: 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74   disk file and t
f190: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
f1a0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
f1b0: 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20  stored the next 
f1c0: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
f1d0: 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  e is.  ** opened
f1e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
f1f0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
f200: 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d  ,"synchronous")=
f210: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
f220: 20 56 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b   VdbeOp getSync[
f230: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
f240: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
f250: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
f260: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
f270: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
f280: 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
f290: 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
f2a0: 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
f2b0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f2c0: 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
f2d0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
f2e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f2f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
f300: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
f310: 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
f320: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f330: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f340: 65 72 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  er, db->cache_si
f350: 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20 20 20 20 20  ze>=0, 0);.     
f360: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f370: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
f380: 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53  e(getSync), getS
f390: 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ync);.    }else{
f3a0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
f3b0: 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
f3c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
f3d0: 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
f3e0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67 65  e;.      if( !ge
f3f0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
f400: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
f410: 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
f420: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
f430: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
f440: 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
f450: 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
f460: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
f470: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
f480: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
f490: 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30  "vdbe_trace")==0
f4a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
f4b0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
f4c0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
f4d0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65  s |= SQLITE_Vdbe
f4e0: 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Trace;.    }else
f4f0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
f500: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62  s &= ~SQLITE_Vdb
f510: 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20  eTrace;.    }.  
f520: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
f530: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
f540: 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  , "full_column_n
f550: 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ames")==0 ){.   
f560: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
f570: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
f580: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
f590: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
f5a0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
f5b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
f5c0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
f5d0: 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  Names;.    }.  }
f5e0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
f5f0: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
f600: 20 22 72 65 73 75 6c 74 5f 73 65 74 5f 64 65 74   "result_set_det
f610: 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ails")==0 ){.   
f620: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
f630: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
f640: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
f650: 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69  LITE_ResultDetai
f660: 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ls;.    }else{. 
f670: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
f680: 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73 75 6c 74  = ~SQLITE_Result
f690: 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 20  Details;.    }. 
f6a0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
f6b0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
f6c0: 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65  t, "count_change
f6d0: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
f6e0: 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
f6f0: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
f700: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
f710: 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20  E_CountRows;.   
f720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
f730: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
f740: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20  TE_CountRows;.  
f750: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
f760: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
f770: 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74 79 5f 72  (zLeft, "empty_r
f780: 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 22  esult_callbacks"
f790: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
f7a0: 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
f7b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
f7c0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
f7d0: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  NullCallback;.  
f7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
f7f0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
f800: 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
f810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
f820: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
f830: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62  ICmp(zLeft, "tab
f840: 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a  le_info")==0 ){.
f850: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
f860: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
f870: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
f880: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
f890: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ght);.    if( pT
f8a0: 61 62 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47  ab ) v = sqliteG
f8b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f8c0: 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20      if( pTab && 
f8d0: 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  v ){.      stati
f8e0: 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e  c VdbeOp tableIn
f8f0: 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  foPreface[] = {.
f900: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
f910: 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c 20  umnCount, 5, 0, 
f920: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
f930: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
f940: 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
f950: 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20  "cid"},.        
f960: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
f970: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    1, 0,       "n
f980: 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ame"},.        {
f990: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
f9a0: 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 74 79   2, 0,       "ty
f9b0: 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  pe"},.        { 
f9c0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
f9d0: 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 6f 74  3, 0,       "not
f9e0: 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20 20  null"},.        
f9f0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
fa00: 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20 22 64    4, 0,       "d
fa10: 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20 20  flt_value"},.   
fa20: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
fa30: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  i;.      sqliteV
fa40: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
fa50: 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49  ArraySize(tableI
fa60: 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62  nfoPreface), tab
fa70: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a  leInfoPreface);.
fa80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77        sqliteView
fa90: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
faa0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
fab0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
fac0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
fad0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
fae0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
faf0: 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
fb00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
fb10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
fb20: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
fb30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
fb40: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
fb50: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
fb60: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
fb70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
fb80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
fb90: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
fba0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
fbb0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 0a 20  angeP3(v, -1, . 
fbc0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
fbd0: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3f 20  aCol[i].zType ? 
fbe0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  pTab->aCol[i].zT
fbf0: 79 70 65 20 3a 20 22 74 65 78 74 22 2c 20 50 33  ype : "text", P3
fc00: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
fc10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fc20: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
fc30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
fc40: 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  otNull, 0);.    
fc50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fc60: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
fc70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
fc80: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
fc90: 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
fca0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20  >aCol[i].zDflt, 
fcb0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
fcc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fcd0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
fce0: 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20  ck, 5, 0);.     
fcf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
fd00: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
fd10: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e  rICmp(zLeft, "in
fd20: 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b  dex_info")==0 ){
fd30: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
fd40: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
fd50: 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  b;.    Vdbe *v;.
fd60: 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74      pIdx = sqlit
fd70: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
fd80: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
fd90: 70 49 64 78 20 29 20 76 20 3d 20 73 71 6c 69 74  pIdx ) v = sqlit
fda0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
fdb0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26  ;.    if( pIdx &
fdc0: 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61  & v ){.      sta
fdd0: 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65  tic VdbeOp table
fde0: 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20  InfoPreface[] = 
fdf0: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  {.        { OP_C
fe00: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30  olumnCount, 3, 0
fe10: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
fe20: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
fe30: 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
fe40: 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20 20    "seqno"},.    
fe50: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
fe60: 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
fe70: 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20    "cid"},.      
fe80: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
fe90: 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
fea0: 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 7d  "name"},.      }
feb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
fec0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64 78       pTab = pIdx
fed0: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->pTable;.      
fee0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
fef0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
ff00: 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63  (tableInfoPrefac
ff10: 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  e), tableInfoPre
ff20: 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  face);.      for
ff30: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
ff40: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
ff50: 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20       int cnum = 
ff60: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
ff70: 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
ff80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ff90: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
ffa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
ffb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ffc0: 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29  nteger, cnum, 0)
ffd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ffe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fff0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
10000 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10010 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29  Tab->nCol>cnum )
10020 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10030 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10040 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63  -1, pTab->aCol[c
10050 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53  num].zName, P3_S
10060 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
10070 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10080 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
10090 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  3, 0);.      }. 
100a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
100b0 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
100c0 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f  p(zLeft, "index_
100d0 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
100e0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
100f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
10100 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
10110 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
10120 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
10130 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  t);.    if( pTab
10140 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71   ){.      v = sq
10150 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
10160 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20  se);.      pIdx 
10170 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
10180 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
10190 61 62 20 26 26 20 70 49 64 78 20 26 26 20 76 20  ab && pIdx && v 
101a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d  ){.      int i =
101b0 20 30 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69   0; .      stati
101c0 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69  c VdbeOp indexLi
101d0 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  stPreface[] = {.
101e0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
101f0 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20  umnCount, 3, 0, 
10200 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
10210 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10220 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
10230 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20 20 20  "seq"},.        
10240 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10250 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    1, 0,       "n
10260 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ame"},.        {
10270 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
10280 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 75 6e   2, 0,       "un
10290 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b  ique"},.      };
102a0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ..      sqliteVd
102b0 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
102c0 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69  rraySize(indexLi
102d0 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65  stPreface), inde
102e0 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20  xListPreface);. 
102f0 20 20 20 20 20 77 68 69 6c 65 28 70 49 64 78 29       while(pIdx)
10300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10310 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10320 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a  Integer, i, 0);.
10330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10340 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
10350 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
10360 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
10370 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
10380 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
10390 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
103a0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
103b0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
103c0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
103d0 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20  _None, 0);.     
103e0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
103f0 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
10400 6b 2c 20 33 2c 20 30 29 3b 0a 09 2b 2b 69 3b 0a  k, 3, 0);..++i;.
10410 09 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e  .pIdx = pIdx->pN
10420 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
10430 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
10440 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28  def NDEBUG.  if(
10450 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10460 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72  Left, "parser_tr
10470 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ace")==0 ){.    
10480 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
10490 74 65 50 61 72 73 65 72 54 72 61 63 65 28 46 49  teParserTrace(FI
104a0 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20  LE*, char *);.  
104b0 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
104c0 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
104d0 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72    sqliteParserTr
104e0 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72  ace(stdout, "par
104f0 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ser: ");.    }el
10500 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
10510 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30  ParserTrace(0, 0
10520 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
10530 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
10540 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10550 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f 63  ft, "integrity_c
10560 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  heck")==0 ){.   
10570 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 63   static VdbeOp c
10580 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20 20  heckDb[] = {.   
10590 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72     { OP_SetInser
105a0 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  t,   0, 0,      
105b0 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20    "2"},.      { 
105c0 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  OP_Open,        
105d0 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
105e0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
105f0 6e 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20 20  nd,      0, 6,  
10600 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
10610 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
10620 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
10630 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  },.      { OP_Se
10640 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c  tInsert,   0, 0,
10650 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
10660 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
10670 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
10680 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
10690 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30 2c 20  IntegrityCk, 0, 
106a0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
106b0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
106c0 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
106d0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
106e0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
106f0 2c 20 30 2c 20 20 20 20 20 20 20 20 22 69 6e 74  , 0,        "int
10700 65 67 72 69 74 79 5f 63 68 65 63 6b 22 7d 2c 0a  egrity_check"},.
10710 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
10720 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
10730 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
10740 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
10750 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
10760 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
10770 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
10780 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
10790 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
107a0 28 63 68 65 63 6b 44 62 29 2c 20 63 68 65 63 6b  (checkDb), check
107b0 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  Db);.  }else..  
107c0 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  {}.  sqliteFree(
107d0 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  zLeft);.  sqlite
107e0 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a  Free(zRight);.}.