/ Hex Artifact Content
Login

Artifact 36e42718a7a94f554ea39508993378482f5335c7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 39 35 20 32 30 30  ild.c,v 1.95 200
0310: 32 2f 30 35 2f 32 34 20 32 30 3a 33 31 3a 33 37  2/05/24 20:31:37
0320: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0330: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0340: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0350: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0360: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0370: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0380: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0390: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03a0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03b0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03c0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03d0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
03f0: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0400: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0410: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0420: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0430: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0440: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0450: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0460: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0470: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0480: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
0490: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04b0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04c0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04d0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04e0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
04f0: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0500: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0520: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0530: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0540: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0550: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0560: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0570: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0580: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
0590: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05a0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05b0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05d0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05e0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0610: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0630: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0640: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0650: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0660: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0670: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0680: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
0690: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06a0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06b0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06c0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06d0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06e0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0700: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0710: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0740: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0750: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0760: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0770: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0780: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
0790: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07a0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07c0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07d0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07e0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
07f0: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
0810: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0830: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0840: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0850: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0860: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0870: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0880: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0890: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
08a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
08b0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
08c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
08d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c    Table *p = sql
08e0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
08f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
0900: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
0910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
0920: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0930: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0940: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0950: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0960: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0970: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0980: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
0990: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
09a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
09b0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
09c0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
09d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
09e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73  {.  Index *p = s
09f0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0a00: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0a10: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0a20: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0a40: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0a50: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0a60: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0a70: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0a80: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0a90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0aa0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0ab0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0ac0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0ad0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0ae0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
0af0: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
0b00: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
0b10: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
0b20: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
0b30: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
0b40: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
0b50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
0b60: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0b70: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
0b80: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
0b90: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
0ba0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
0bb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
0bc0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
0bd0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
0be0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
0bf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
0c00: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
0c10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
0c20: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c30: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
0c40: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
0c50: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
0c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
0c70: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c80: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
0c90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
0cb0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0cc0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
0cd0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
0ce0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
0cf0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d00: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
0d10: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
0d20: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0d30: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
0d40: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
0d50: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
0d60: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
0d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
0d80: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
0d90: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
0da0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
0db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
0dc0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
0dd0: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
0de0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
0df0: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
0e00: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
0e10: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
0e20: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
0e30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
0e40: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
0e50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
0e60: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
0e70: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
0e80: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
0e90: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
0ea0: 78 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  x to the pending
0eb0: 20 44 52 4f 50 20 49 4e 44 45 58 20 71 75 65 75   DROP INDEX queu
0ec0: 65 20 69 66 20 69 74 20 68 61 73 0a 2a 2a 20 62  e if it has.** b
0ed0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  een committed.  
0ee0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 77 61  If this index wa
0ef0: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
0f00: 64 2c 20 74 68 65 6e 20 6a 75 73 74 0a 2a 2a 20  d, then just.** 
0f10: 64 65 6c 65 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  delete it..**.**
0f20: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
0f30: 70 65 6e 64 69 6e 67 20 64 72 6f 70 20 71 75 65  pending drop que
0f40: 75 65 20 61 72 65 20 64 65 6c 65 74 65 64 20 77  ue are deleted w
0f50: 68 65 6e 20 61 20 43 4f 4d 4d 49 54 20 69 73 0a  hen a COMMIT is.
0f60: 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  ** executed.  If
0f70: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75   a ROLLBACK occu
0f80: 72 73 2c 20 74 68 65 20 69 6e 64 69 63 65 73 20  rs, the indices 
0f90: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
0fa0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  nto.** the main 
0fb0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fd0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
0fe0: 6f 70 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  opIndex(sqlite *
0ff0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1000: 20 69 66 28 20 21 70 2d 3e 69 73 43 6f 6d 6d 69   if( !p->isCommi
1010: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  t ){.    sqliteU
1020: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1030: 64 65 78 28 64 62 2c 20 70 29 3b 0a 20 20 7d 65  dex(db, p);.  }e
1040: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1050: 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  pOld;.    pOld =
1060: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1070: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
1080: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
1090: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
10a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
10b0: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
10c0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
10d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10e0: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
10f0: 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a  , strlen(pOld->z
1100: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
1110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1120: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1130: 69 64 78 44 72 6f 70 2c 20 70 2c 20 30 2c 20 70  idxDrop, p, 0, p
1140: 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 72 6f 70  );.    p->isDrop
1150: 70 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ped = 1;.  }.}..
1160: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1170: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1180: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
1190: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
11a0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
11b0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11c0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
11d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
11e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
11f0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
1200: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
1210: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
1220: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
1230: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1240: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1250: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
1260: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1270: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1280: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
1290: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
12b0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
12c0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
12d0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
12e0: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
12f0: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
1300: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
1310: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
1320: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
1330: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
1340: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
1350: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
1360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
1370: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
1380: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  id sqliteDeleteT
1390: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
13a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
13b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65  .  int i;.  Inde
13c0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
13d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  t;.  if( pTable=
13e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
1400: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1420: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
1430: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
1440: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1450: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
1460: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1470: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
1480: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e  );.  }.  for(pIn
1490: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
14a0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
14b0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
14c0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
14d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
14e0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
14f0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
1500: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1510: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
1520: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1530: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
1540: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
1550: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
1560: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1570: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
1580: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
1590: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
15a0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
15b0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
15c0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
15d0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
15e0: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
15f0: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1600: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
1610: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
1620: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
1630: 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  pOld;.  assert( 
1640: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1650: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1660: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1670: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1680: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
16a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
16b0: 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49  );.  sqliteHashI
16c0: 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44 72  nsert(&db->tblDr
16d0: 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  op, p, 0, 0);.  
16e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
16f0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1700: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69 76 65  ** Move the give
1710: 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 70  n table to the p
1720: 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41 42 4c  ending DROP TABL
1730: 45 20 71 75 65 75 65 20 69 66 20 69 74 20 68 61  E queue if it ha
1740: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d 69 74  s.** been commit
1750: 74 65 64 2e 20 20 49 66 20 74 68 69 73 20 74 61  ted.  If this ta
1760: 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f  ble was never co
1770: 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6a 75  mmitted, then ju
1780: 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69 74 2e  st.** delete it.
1790: 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20 66 6f    Do the same fo
17a0: 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  r all its indice
17b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f  s..**.** Table o
17c0: 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65 75 65  n the drop queue
17d0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
17e0: 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69 6c 20  y deleted until 
17f0: 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74 61 74  a COMMIT.** stat
1800: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
1810: 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42 41 43  d.  If a ROLLBAC
1820: 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65 61 64  K occurs instead
1830: 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a 2a 2a   of a COMMIT,.**
1840: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   then the tables
1850: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1860: 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63  ue are moved bac
1870: 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a  k into the main.
1880: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ** hash table..*
1890: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18a0: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 54  litePendingDropT
18b0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
18c0: 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b 0a 20   Table *pTbl){. 
18d0: 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73 43 6f   if( !pTbl->isCo
18e0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
18f0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1900: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62 6c 29  eTable(db, pTbl)
1910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
1920: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
1930: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
1940: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c 64 20  pNext;.    pOld 
1950: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1960: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1970: 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74   pTbl->zName, st
1980: 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61 6d 65  rlen(pTbl->zName
1990: 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73 73 65  )+1,0);.    asse
19a0: 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c 20 29  rt( pOld==pTbl )
19b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
19c0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44  Insert(&db->tblD
19d0: 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20 70 54  rop, pTbl, 0, pT
19e0: 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  bl);.    for(pIn
19f0: 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49 6e 64  dex = pTbl->pInd
1a00: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a10: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  ex=pNext){.     
1a20: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
1a30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a40: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
1a50: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54  *.** Check all T
1a80: 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65  ables and Indexe
1a90: 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  s in the interna
1aa0: 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  l hash table and
1ab0: 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61   commit.** any a
1ac0: 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65  dditions or dele
1ad0: 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68  tions to those h
1ae0: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ash tables..**.*
1af0: 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67  * When executing
1b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e   CREATE TABLE an
1b10: 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  d CREATE INDEX s
1b20: 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54  tatements, the T
1b30: 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65  able.** and Inde
1b40: 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65  x structures are
1b50: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
1b60: 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ed to the hash t
1b70: 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68  ables, but.** th
1b80: 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65  e "isCommit" fie
1b90: 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20  ld is not set.  
1ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1bb0: 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  s those fields..
1bc0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1bd0: 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64  g DROP TABLE and
1be0: 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65   DROP INDEX, the
1bf0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1c00: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1c10: 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66 20 74  e moved out of t
1c20: 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78 48 61  blHash and idxHa
1c30: 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f 70 20  sh into tblDrop 
1c40: 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20 54 68  and idxDrop.  Th
1c50: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 65  is.** routine de
1c60: 6c 65 74 65 73 20 74 68 65 20 73 74 72 75 63 74  letes the struct
1c70: 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70 20 61  ure in tblDrop a
1c80: 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a 0a 2a  nd idxDrop..**.*
1c90: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
1ca0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1cb0: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
1cc0: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1cd0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1ce0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48  sqlite *db){.  H
1cf0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
1d00: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
1d10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
1d20: 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20 72 65  Changes)==0 ) re
1d30: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63 68 65  turn;.  db->sche
1d40: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1d50: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1d60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1d70: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1d80: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1d90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1da0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1db0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1dc0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1dd0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 61 62  pElem);.    pTab
1de0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  le->isCommit = 1
1df0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  ;.  }.  for(pEle
1e00: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1e10: 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70 29 3b  t(&db->tblDrop);
1e20: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e30: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e40: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1e50: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1e60: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1e80: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
1e90: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1ea0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 74  HashClear(&db->t
1eb0: 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72 28 70  blDrop);.  for(p
1ec0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1ed0: 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61 73  irst(&db->idxHas
1ee0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
1ef0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1f00: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1f10: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1f20: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1f30: 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  m);.    pIndex->
1f40: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1f50: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45 6c 65  }.  while( (pEle
1f60: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f70: 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29 29  t(&db->idxDrop))
1f80: 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  !=0 ){.    Index
1f90: 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74   *pIndex = sqlit
1fa0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  ;.    sqliteUnli
1fc0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1fd0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1fe0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
1ff0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
2000: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2010: 20 63 6f 6d 6d 69 74 20 66 6c 61 67 20 6f 6e 20   commit flag on 
2020: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 64 64  all triggers add
2030: 65 64 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ed this transact
2040: 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 70 45 6c  ion */.  for(pEl
2050: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2060: 73 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68  st(&db->trigHash
2070: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2080: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2090: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
20a0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
20b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
20c0: 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 72 69 67  Elem);.    pTrig
20d0: 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20  ger->isCommit = 
20e0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  1;.  }..  /* Del
20f0: 65 74 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ete the structur
2100: 65 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20  es for triggers 
2110: 72 65 6d 6f 76 65 64 20 74 68 69 73 20 74 72 61  removed this tra
2120: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 45  nsaction */.  pE
2130: 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68  lem = sqliteHash
2140: 46 69 72 73 74 28 26 64 62 2d 3e 74 72 69 67 44  First(&db->trigD
2150: 72 6f 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  rop);.  while( p
2160: 45 6c 65 6d 20 29 7b 0a 20 20 20 20 54 72 69 67  Elem ){.    Trig
2170: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
2180: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2190: 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Elem);.    sqlit
21a0: 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70  eDeleteTrigger(p
21b0: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 45  Trigger);.    pE
21c0: 6c 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68  lem = sqliteHash
21d0: 4e 65 78 74 28 70 45 6c 65 6d 29 3b 0a 20 20 7d  Next(pElem);.  }
21e0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
21f0: 61 72 28 26 64 62 2d 3e 74 72 69 67 44 72 6f 70  ar(&db->trigDrop
2200: 29 3b 0a 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  );..  db->flags 
2210: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2220: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2240: 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72  runs when one or
2250: 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42   more CREATE TAB
2260: 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58  LE, CREATE INDEX
2270: 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c  ,.** DROP TABLE,
2280: 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73   or DROP INDEX s
2290: 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72  tatements gets r
22a0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65  olled back.  The
22b0: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72  .** additions or
22c0: 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61   deletions of Ta
22d0: 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74  ble and Index st
22e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a  ructures in the.
22f0: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2300: 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f   tables are undo
2310: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ne..**.** See al
2320: 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  so: sqliteCommit
2330: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2340: 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ).*/.void sqlite
2350: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
2360: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
2370: 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65  db){.  Hash toDe
2380: 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d  lete;.  HashElem
2390: 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28   *pElem;.  if( (
23a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
23b0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
23c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
23d0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28   sqliteHashInit(
23e0: 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54  &toDelete, SQLIT
23f0: 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20  E_HASH_POINTER, 
2400: 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63  0);.  db->next_c
2410: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65  ookie = db->sche
2420: 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72  ma_cookie;.  for
2430: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2440: 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48  hFirst(&db->tblH
2450: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
2460: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2470: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
2480: 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73  able *pTable = s
2490: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
24a0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70  lem);.    if( !p
24b0: 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20  Table->isCommit 
24c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48  ){.      sqliteH
24d0: 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c  ashInsert(&toDel
24e0: 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20  ete, pTable, 0, 
24f0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  pTable);.    }. 
2500: 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73   }.  for(pElem=s
2510: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2520: 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d  toDelete); pElem
2530: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
2540: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
2550: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c      Table *pTabl
2560: 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  e = sqliteHashDa
2570: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73  ta(pElem);.    s
2580: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
2590: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
25a0: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  able);.  }.  sql
25b0: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f  iteHashClear(&to
25c0: 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70  Delete);.  for(p
25d0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
25e0: 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f  irst(&db->tblDro
25f0: 70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  p); pElem; pElem
2600: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2610: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
2620: 6c 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73  le *pOld, *p = s
2630: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2640: 6c 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  lem);.    assert
2650: 28 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b  ( p->isCommit );
2660: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
2670: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2680: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
2690: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
26a0: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
26b0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
26c0: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
26d0: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
26e0: 6c 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f  lear(&db->tblDro
26f0: 70 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  p);.  for(pElem=
2700: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2710: 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  &db->idxHash); p
2720: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2730: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2740: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
2750: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61  Index = sqliteHa
2760: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2770: 20 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e     if( !pIndex->
2780: 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
2790: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
27a0: 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49  rt(&toDelete, pI
27b0: 6e 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29  ndex, 0, pIndex)
27c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
27d0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27e0: 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74  shFirst(&toDelet
27f0: 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  e); pElem; pElem
2800: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2810: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
2820: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2830: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2840: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
2850: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2860: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2870: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2880: 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29  Clear(&toDelete)
2890: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
28a0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
28b0: 62 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c  b->idxDrop); pEl
28c0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
28d0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
28e0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c  {.    Index *pOl
28f0: 64 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61  d, *p = sqliteHa
2900: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2910: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
2920: 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d  Commit );.    p-
2930: 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a  >isDropped = 0;.
2940: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2950: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2960: 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >idxHash, p->zNa
2970: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
2980: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
2990: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
29a0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
29b0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
29c0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
29d0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
29e0: 61 6e 79 20 74 72 69 67 67 65 72 73 20 74 68 61  any triggers tha
29f0: 74 20 68 61 76 65 6e 27 74 20 62 65 65 6e 20 63  t haven't been c
2a00: 6f 6d 6d 69 74 65 64 20 79 65 74 20 2a 2f 0a 20  ommited yet */. 
2a10: 20 66 6f 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c   for(pElem = sql
2a20: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
2a30: 2d 3e 74 72 69 67 48 61 73 68 29 3b 20 70 45 6c  ->trigHash); pEl
2a40: 65 6d 3b 20 0a 20 20 20 20 20 20 70 45 6c 65 6d  em; .      pElem
2a50: 20 3d 20 28 70 45 6c 65 6d 3f 73 71 6c 69 74 65   = (pElem?sqlite
2a60: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 3a  HashNext(pElem):
2a70: 30 29 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  0)){.    Trigger
2a80: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c   *pTrigger = sql
2a90: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2aa0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 72  m);.    if( !pTr
2ab0: 69 67 67 65 72 2d 3e 69 73 43 6f 6d 6d 69 74 20  igger->isCommit 
2ac0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2ad0: 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTbl = sqliteFin
2ae0: 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72 69 67  dTable(db, pTrig
2af0: 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20  ger->table);.   
2b00: 20 20 20 69 66 28 20 70 54 62 6c 20 29 7b 0a 20     if( pTbl ){. 
2b10: 20 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 2d         if( pTbl-
2b20: 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54 72  >pTrigger == pTr
2b30: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
2b40: 20 20 20 70 54 62 6c 2d 3e 70 54 72 69 67 67 65     pTbl->pTrigge
2b50: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
2b60: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ext;.        }el
2b70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54 72  se{.          Tr
2b80: 69 67 67 65 72 20 2a 63 63 20 3d 20 70 54 62 6c  igger *cc = pTbl
2b90: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
2ba0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 63 20        while( cc 
2bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2bc0: 66 28 20 63 63 2d 3e 70 4e 65 78 74 20 3d 3d 20  f( cc->pNext == 
2bd0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
2be0: 20 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70 4e            cc->pN
2bf0: 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d  ext = cc->pNext-
2c00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
2c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c30: 20 20 20 20 20 20 20 63 63 20 3d 20 63 63 2d 3e         cc = cc->
2c40: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
2c50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2c60: 65 72 74 28 63 63 29 3b 0a 20 20 20 20 20 20 20  ert(cc);.       
2c70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c80: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
2c90: 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68 2c  t(&db->trigHash,
2ca0: 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c   pTrigger->name,
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  .              1
2cc0: 20 2b 20 73 74 72 6c 65 6e 28 70 54 72 69 67 67   + strlen(pTrigg
2cd0: 65 72 2d 3e 6e 61 6d 65 29 2c 20 30 29 3b 0a 20  er->name), 0);. 
2ce0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
2cf0: 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  eTrigger(pTrigge
2d00: 72 29 3b 0a 20 20 20 20 20 20 70 45 6c 65 6d 20  r);.      pElem 
2d10: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
2d20: 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73 68 29  t(&db->trigHash)
2d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d40: 2a 20 41 6e 79 20 74 72 69 67 67 65 72 73 20 74  * Any triggers t
2d50: 68 61 74 20 77 65 72 65 20 64 72 6f 70 70 65 64  hat were dropped
2d60: 20 2d 20 70 75 74 20 27 65 6d 20 62 61 63 6b 20   - put 'em back 
2d70: 69 6e 20 70 6c 61 63 65 20 2a 2f 0a 20 20 66 6f  in place */.  fo
2d80: 72 28 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65  r(pElem = sqlite
2d90: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74  HashFirst(&db->t
2da0: 72 69 67 44 72 6f 70 29 3b 20 70 45 6c 65 6d 3b  rigDrop); pElem;
2db0: 20 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20   .      pElem = 
2dc0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2dd0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
2de0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
2df0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2e00: 45 6c 65 6d 29 3b 0a 20 20 20 20 54 61 62 6c 65  Elem);.    Table
2e10: 20 2a 70 54 62 6c 20 3d 20 73 71 6c 69 74 65 46   *pTbl = sqliteF
2e20: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 54 72  indTable(db, pTr
2e30: 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20  igger->table);. 
2e40: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2e50: 65 72 74 28 26 64 62 2d 3e 74 72 69 67 48 61 73  ert(&db->trigHas
2e60: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  h, pTrigger->nam
2e70: 65 2c 20 0a 20 20 20 20 20 20 20 20 73 74 72 6c  e, .        strl
2e80: 65 6e 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  en(pTrigger->nam
2e90: 65 29 20 2b 20 31 2c 20 70 54 72 69 67 67 65 72  e) + 1, pTrigger
2ea0: 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d  );.    pTrigger-
2eb0: 3e 70 4e 65 78 74 20 3d 20 70 54 62 6c 2d 3e 70  >pNext = pTbl->p
2ec0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70 54 62  Trigger;.    pTb
2ed0: 6c 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  l->pTrigger = pT
2ee0: 72 69 67 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 73  rigger;.  }..  s
2ef0: 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26  qliteHashClear(&
2f00: 64 62 2d 3e 74 72 69 67 44 72 6f 70 29 3b 0a 20  db->trigDrop);. 
2f10: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2f20: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2f30: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ges;.}../*.** Co
2f40: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
2f50: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
2f60: 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61   or index from a
2f70: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
2f80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2f90: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
2fa0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
2fb0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
2fc0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
2fd0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2fe0: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
2ff0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
3000: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
3010: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
3020: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
3030: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3040: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
3050: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3060: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
3070: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
3080: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
3090: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
30a0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
30b0: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
30c0: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
30d0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
30e0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
30f0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
3100: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
3110: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
3120: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
3130: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3140: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
3150: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
3160: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
3170: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
3180: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
3190: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
31a0: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
31b0: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
31c0: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
31d0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
31e0: 20 69 66 20 74 68 65 20 22 54 45 4d 50 22 20 6f   if the "TEMP" o
31f0: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
3200: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
3210: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
3220: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
3230: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
3240: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
3250: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
3260: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
3270: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
3280: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
3290: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
32a0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
32b0: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
32c0: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
32d0: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
32e0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
32f0: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
3300: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
3310: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
3320: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
3330: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
3340: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
3350: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
3360: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
3370: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
3380: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
3390: 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  id sqliteStartTa
33a0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
33b0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  e, Token *pStart
33c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
33d0: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54  int isTemp){.  T
33e0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
33f0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
3400: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
3410: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
3420: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
3430: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69  ;..  pParse->sFi
3440: 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61  rstToken = *pSta
3450: 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  rt;.  zName = sq
3460: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
3470: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
3480: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
3490: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
34a0: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63  fore trying to c
34b0: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
34c0: 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75  y table, make su
34d0: 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72  re the Btree for
34e0: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65  .  ** holding te
34f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69  mporary tables i
3500: 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  s open..  */.  i
3510: 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d  f( isTemp && db-
3520: 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  >pBeTemp==0 ){. 
3530: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
3540: 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  teBtreeOpen(0, 0
3550: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
3560: 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
3570: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3580: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
3590: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
35a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
35b0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
35c0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
35d0: 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
35e0: 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
35f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
3600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
3610: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3620: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3630: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
3640: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
3650: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
3660: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
3670: 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65 54 65  nTrans(db->pBeTe
3680: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
3690: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
36b0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
36c0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
36d0: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
36e0: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
36f0: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
3700: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
3710: 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  le", 0);.       
3720: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3730: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
3740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3750: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
3760: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
3770: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
3780: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
3790: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
37a0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
37b0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
37c0: 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20  r message if it 
37d0: 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  does..  **.  ** 
37e0: 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61  If we are re-rea
37f0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
3800: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
3810: 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61  ause of a schema
3820: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64  .  ** change and
3830: 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74   a new permanent
3840: 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20   table is found 
3850: 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69  whose name colli
3860: 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  des with.  ** an
3870: 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72   existing tempor
3880: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ary table, then 
3890: 69 67 6e 6f 72 65 20 74 68 65 20 6e 65 77 20 70  ignore the new p
38a0: 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a  ermanent table..
38b0: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e    ** We will con
38c0: 74 69 6e 75 65 20 70 61 72 73 69 6e 67 2c 20 62  tinue parsing, b
38d0: 75 74 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  ut the pParse->n
38e0: 61 6d 65 43 6c 61 73 68 20 66 6c 61 67 20 77 69  ameClash flag wi
38f0: 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a 20 73  ll be set.  ** s
3900: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74  o we will know t
3910: 6f 20 64 69 73 63 61 72 64 20 74 68 65 20 74 61  o discard the ta
3920: 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63 65 20  ble record once 
3930: 70 61 72 73 69 6e 67 20 68 61 73 20 66 69 6e 69  parsing has fini
3940: 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  shed..  */.  pTa
3950: 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ble = sqliteFind
3960: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29  Table(db, zName)
3970: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  ;.  if( pTable!=
3980: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  0 ){.    if( pTa
3990: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  ble->isTemp && p
39a0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
39b0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
39c0: 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a  >nameClash = 1;.
39d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
39e0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
39f0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3a00: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c  sg, "table ", 0,
3a10: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
3a20: 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ->n,.          "
3a30: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
3a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3a50: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3a60: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3a70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
3a80: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  turn;.    }.  }e
3a90: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
3aa0: 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a  >nameClash = 0;.
3ab0: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
3ac0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
3ad0: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  x(db, zName))!=0
3ae0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 21   &&.          (!
3af0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73  pIdx->pTable->is
3b00: 54 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65 2d  Temp || !pParse-
3b10: 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20  >initFlag) ){.  
3b20: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3b30: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3b40: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
3b50: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
3b60: 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20  amed ", .       
3b70: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
3b80: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3b90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
3ba0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
3bb0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
3bc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
3bd0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
3be0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3bf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
3c00: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
3c10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
3c20: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
3c30: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
3c40: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3c50: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
3c60: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
3c70: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
3c80: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
3c90: 3e 69 73 54 65 6d 70 20 3d 20 69 73 54 65 6d 70  >isTemp = isTemp
3ca0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3cb0: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
3cc0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
3cd0: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
3ce0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
3cf0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
3d00: 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  le;..  /* Begin 
3d10: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
3d20: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
3d30: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
3d40: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
3d50: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
3d60: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
3d70: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
3d80: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
3d90: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
3da0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
3db0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
3dc0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
3dd0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
3de0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
3df0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
3e00: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
3e10: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
3e20: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
3e30: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
3e40: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
3e50: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
3e60: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
3e70: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
3e80: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
3e90: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
3ea0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
3eb0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
3ec0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
3ed0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28  e->initFlag && (
3ee0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
3ef0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
3f00: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
3f10: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3f20: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 69  Parse, 0);.    i
3f30: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3f40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3f50: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3f60: 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  r, db->file_form
3f70: 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  at, 0);.      sq
3f80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f90: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
3fa0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3fc0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
3fd0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
3fe0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3ff0: 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  -1, MASTER_NAME,
4000: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4010: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4020: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
4030: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
4040: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4050: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4070: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4080: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
4090: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
40a0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
40b0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ey, 0, 0);.    }
40c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
40d0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
40e0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
40f0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
4100: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
4110: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
4120: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
4130: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4140: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
4150: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
4160: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
4170: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
4180: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
4190: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
41a0: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
41b0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
41c0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
41d0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
41e0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
41f0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
4200: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
4210: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4220: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4230: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 28 70 20  z = 0;.  if( (p 
4240: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4250: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4260: 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
4270: 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e  ring(&z, pName->
4280: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
4290: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
42a0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
42b0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
42c0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
42d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
42e0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70  liteStrICmp(z, p
42f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
4300: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4310: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
4320: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4330: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
4340: 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30 29 3b   name: ", z, 0);
4350: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4360: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
4370: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
4380: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4390: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
43a0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
43b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
43c0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
43d0: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
43e0: 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29  Col, (p->nCol+8)
43f0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
4400: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
4410: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
4420: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
4430: 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ew;.  }.  memset
4440: 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  (&p->aCol[p->nCo
4450: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  l], 0, sizeof(p-
4460: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 2d  >aCol[0]));.  p-
4470: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d  >aCol[p->nCol++]
4480: 2e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 7d 0a 0a 2f  .zName = z;.}../
4490: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
44a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
44b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
44c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
44d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
44e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
44f0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
4500: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
4510: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
4520: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
4530: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4540: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
4550: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
4560: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
4570: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
4580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
4590: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
45a0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
45b0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
45c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
45d0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
45e0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
45f0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4600: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
4610: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
4620: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
4630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4640: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4650: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
4660: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
4670: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
4680: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
4690: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
46a0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
46b0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
46c0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
46d0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
46e0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
46f0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
4700: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
4710: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4720: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
4730: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
4740: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
4750: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
4760: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
4770: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
4780: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
4790: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
47a0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
47b0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
47c0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
47d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43  .void sqliteAddC
47e0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
47f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
4800: 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  pFirst, Token *p
4810: 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Last){.  Table *
4820: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
4830: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
4840: 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  z, **pz;.  if( (
4850: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4860: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4870: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
4880: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
4890: 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20   return;.  pz = 
48a0: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  &p->aCol[i].zTyp
48b0: 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e  e;.  n = pLast->
48c0: 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e  n + Addr(pLast->
48d0: 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72 73 74  z) - Addr(pFirst
48e0: 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  ->z);.  sqliteSe
48f0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69  tNString(pz, pFi
4900: 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20  rst->z, n, 0);. 
4910: 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20   z = *pz;.  if( 
4920: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
4930: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d   for(i=j=0; z[i]
4940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
4950: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66  c = z[i];.    if
4960: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
4970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
4980: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
4990: 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
49a0: 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65  * The given toke
49b0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
49c0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c   value for the l
49d0: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
49e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
49f0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4a00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4a10: 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69  If "minusFlag" i
4a20: 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65  s true, it.** me
4a30: 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ans the value to
4a40: 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65 64  ken was preceded
4a50: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
4a60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4a70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
4a80: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
4a90: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
4aa0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
4ab0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4ac0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
4ad0: 20 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c   sqliteAddDefaul
4ae0: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
4af0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61  arse, Token *pVa
4b00: 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67  l, int minusFlag
4b10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4b20: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4b30: 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  *pz;.  if( (p = 
4b40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4b50: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4b60: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4b70: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4b80: 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e  urn;.  pz = &p->
4b90: 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20  aCol[i].zDflt;. 
4ba0: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
4bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
4bc0: 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20  String(pz, "-", 
4bd0: 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  1, pVal->z, pVal
4be0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
4bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
4c00: 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d  String(pz, pVal-
4c10: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
4c20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71  .  }.  sqliteDeq
4c30: 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a  uote(*pz);.}../*
4c40: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
4c50: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
4c60: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
4c70: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
4c80: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
4c90: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
4ca0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
4cb0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
4cc0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
4cd0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
4ce0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
4cf0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
4d00: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
4d10: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
4d20: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
4d30: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
4d40: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
4d50: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
4d60: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
4d70: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
4d80: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
4d90: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
4da0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
4db0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
4dc0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
4dd0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
4de0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
4df0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
4e00: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
4e10: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
4e20: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
4e30: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
4e40: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
4e50: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
4e60: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
4e70: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
4e80: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
4e90: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
4ea0: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
4eb0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
4ec0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
4ed0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
4ee0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
4ef0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
4f00: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
4f10: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
4f20: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
4f30: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
4f40: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
4f50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
4f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
4f70: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
4f80: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4f90: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
4fa0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
4fb0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
4fc0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
4fd0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
4fe0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
4ff0: 69 64 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d  id sqliteAddPrim
5000: 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50  aryKey(Parse *pP
5010: 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
5020: 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  ist, int onError
5030: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
5040: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
5050: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
5060: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
5070: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Col = -1;.  if( 
5080: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
5090: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61  ;.  if( pTab->ha
50a0: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
50b0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
50c0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
50d0: 2c 20 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54  , "table \"", pT
50e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
50f0: 20 20 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65      "\" has more
5100: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
5110: 79 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20  y key", 0);.    
5120: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5130: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5140: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
5150: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
5160: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
5170: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
5180: 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  - 1;.  }else if(
5190: 20 70 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29   pList->nId==1 )
51a0: 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  {.    for(iCol=0
51b0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
51c0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
51d0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
51e0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  Cmp(pList->a[0].
51f0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
5200: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
5210: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
5220: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
5230: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5240: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
5250: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5260: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
5270: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5280: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5290: 31 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  1 && .          
52a0: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
52b0: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
52c0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
52d0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
52e0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
52f0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
5300: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
5310: 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e    sqliteCreateIn
5320: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
5330: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
5340: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
5350: 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69  /*.** Come up wi
5360: 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20  th a new random 
5370: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63  value for the sc
5380: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61  hema cookie.  Ma
5390: 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e  ke sure.** the n
53a0: 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66  ew value is diff
53b0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
53c0: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ld..**.** The sc
53d0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
53e0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
53f0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
5400: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
5410: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
5420: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
5430: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
5440: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
5450: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
5460: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
5470: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
5480: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
5490: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
54a0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
54b0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
54c0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
54d0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
54e0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
54f0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
5500: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
5510: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
5520: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
5530: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
5540: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
5550: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
5560: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
5570: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
5580: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
5590: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
55a0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
55b0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
55c0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
55d0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
55e0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
55f0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
5600: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
5610: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
5620: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
5630: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
5640: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
5650: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
5660: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
5670: 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  e(sqlite *db){. 
5680: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
5690: 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61  okie==db->schema
56a0: 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64  _cookie ){.    d
56b0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d  b->next_cookie =
56c0: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
56d0: 69 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f  ie + sqliteRando
56e0: 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20  mByte() + 1;.   
56f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
5700: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
5710: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
5720: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
5730: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5740: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
5750: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
5760: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
5770: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
5780: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
5790: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
57a0: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
57b0: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
57c0: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
57d0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
57e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
57f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
5800: 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20  needQuote = 0;. 
5810: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
5820: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
5830: 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b   *z=='\'' ){ n++
5840: 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d  ; needQuote=1; }
5850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
5860: 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d  + needQuote*2;.}
5870: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
5880: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
5890: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
58a0: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
58b0: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
58c0: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
58d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
58e0: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
58f0: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
5900: 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69  ar *zIdent){.  i
5910: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
5920: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
5930: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
5940: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
5950: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
5960: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
5970: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
5980: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
5990: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
59a0: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
59b0: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
59d0: 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65  qliteKeywordCode
59e0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
59f0: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
5a00: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
5a10: 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  \'';.  for(j=0; 
5a20: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
5a30: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
5a40: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
5a50: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27   zIdent[j]=='\''
5a60: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
5a70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
5a80: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
5a90: 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20   '\'';.  z[i] = 
5aa0: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
5ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5ac0: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
5ad0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
5ae0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
5af0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
5b00: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
5b10: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
5b20: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
5b30: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
5b40: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5b50: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5b60: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
5b70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5b80: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
5b90: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29  leStmt(Table *p)
5ba0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
5bb0: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
5bc0: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
5bd0: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e  Sep2, *zEnd;.  n
5be0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
5bf0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
5c00: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
5c10: 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69  Length(p->aCol[i
5c20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
5c30: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
5c40: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
5c50: 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<40 ){.    zS
5c60: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
5c70: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
5c80: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
5c90: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
5ca0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
5cb0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
5cc0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
5cd0: 0a 20 20 6e 20 2b 3d 20 32 35 20 2b 20 36 2a 70  .  n += 25 + 6*p
5ce0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
5cf0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5d00: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
5d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5d20: 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
5d30: 54 65 6d 70 20 29 3b 0a 20 20 73 74 72 63 70 79  Temp );.  strcpy
5d40: 28 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20  (zStmt, "CREATE 
5d50: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
5d60: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
5d70: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
5d80: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
5d90: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
5da0: 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  (';.  for(i=0; i
5db0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
5dc0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
5dd0: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
5de0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
5df0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
5e00: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
5e10: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
5e20: 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  k, p->aCol[i].zN
5e30: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  ame);.  }.  strc
5e40: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
5e50: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
5e60: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
5e70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5e80: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
5e90: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
5ea0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
5eb0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
5ec0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
5ed0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
5ee0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
5ef0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
5f00: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
5f10: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
5f20: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
5f30: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
5f40: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
5f50: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
5f60: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
5f70: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
5f80: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
5f90: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
5fa0: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73  ,.** unless this
5fb0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
5fc0: 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61  table or initFla
5fd0: 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74  g==1.  When init
5fe0: 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d  Flag==1,.** it m
5ff0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6000: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
6010: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
6020: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
6030: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
6040: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
6050: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
6060: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
6070: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
6080: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
6090: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
60a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
60b0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
60c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
60d0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
60e0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
60f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
6100: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
6110: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
6120: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
6130: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
6140: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
6150: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
6160: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
6170: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
6180: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
6190: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
61a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
61b0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
61c0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
61d0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
61e0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
61f0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
6200: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6210: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
6220: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6230: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
6240: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
6250: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
6260: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
6270: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
6280: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
6290: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
62a0: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
62b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
62c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
62d0: 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  rn;..  /* Add th
62e0: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
62f0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6300: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6310: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
6320: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6330: 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20  nameClash==0 || 
6340: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
6350: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ==1 );.  if( pPa
6360: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
6370: 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  && pParse->nameC
6380: 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54  lash==0 ){.    T
6390: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
63a0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
63b0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
63c0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
63d0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
63e0: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
63f0: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
6400: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
6410: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
6420: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
6430: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
6440: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
6460: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
6470: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
6480: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
6490: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
64a0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
64b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
64c0: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
64d0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74  from a SELECT, t
64e0: 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68  hen construct th
64f0: 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63  e.  ** list of c
6500: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74  olumns and the t
6510: 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ext of the table
6520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  ..  */.  if( pSe
6530: 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c  lect ){.    Tabl
6540: 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  e *pSelTab = sql
6550: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
6560: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
6570: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
6580: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
6590: 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72  eturn;.    asser
65a0: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
65b0: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70  .    p->nCol = p
65c0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
65d0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
65e0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
65f0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
6600: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
6610: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
6620: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
6630: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a  , pSelTab);.  }.
6640: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
6650: 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65  tFlag is 1 it me
6660: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6670: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
6680: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
6690: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
66a0: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
66b0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
66c0: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
66d0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
66e0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
66f0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6700: 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70  from the .  ** p
6710: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66  Parse->newTnum f
6720: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
6730: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68   number should h
6740: 61 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a  ave been put.  *
6750: 2a 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  * there by the s
6760: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
6770: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
6780: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
6790: 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  g ){.    p->tnum
67a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
67b0: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
67c0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
67d0: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
67e0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
67f0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
6800: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
6810: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
6820: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
6830: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
6840: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
6850: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
6860: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
6870: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
6880: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
6890: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
68a0: 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65  e, then just cre
68b0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ate the table.  
68c0: 44 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65  Do not.  ** make
68d0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c   an entry in SQL
68e0: 49 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f  ITE_MASTER..  */
68f0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
6900: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6910: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
6920: 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  *v;..    v = sql
6930: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
6940: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
6950: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6960: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
6970: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
6980: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
6990: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
69a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
69b0: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
69c0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  sTemp);.      sq
69d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
69e0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
69f0: 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  &p->tnum, P3_POI
6a00: 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NTER);.    }else
6a10: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
6a20: 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
6a30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6a40: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6a50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
6a60: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
6a70: 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20  !p->isTemp ){.  
6a80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6a90: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
6aa0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
6ab0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6ac0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6ad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
6ae0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
6af0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6b00: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
6b10: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
6b20: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
6b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6b40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6b50: 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54  1, "view", P3_ST
6b60: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
6b70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6b90: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
6ba0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6bb0: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
6bc0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
6bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6bf0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
6c00: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6c10: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e  eP3(v, -1, p->zN
6c20: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
6c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6c40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
6c50: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 4, 0);.      s
6c60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6c70: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
6c80: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
6c90: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
6ca0: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
6cb0: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
6cc0: 20 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73         n = z ? s
6cd0: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
6ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6cf0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6d00: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  z, n);.        s
6d10: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
6d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
6d40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  =0 );.        n 
6d50: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
6d60: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
6d70: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20  FirstToken.z) + 
6d80: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
6d90: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6da0: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69   -1, pParse->sFi
6db0: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
6dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6dd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6de0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6df0: 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  5, 0);.      sql
6e00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6e10: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
6e20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6e30: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
6e40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6e50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6e60: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74  nteger, db->next
6e70: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
6e80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6e90: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
6ea0: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 0, 0);.     
6eb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6ec0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6ed0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6ee0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
6ef0: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e      int op = p->
6f00: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
6f10: 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57  WrAux : OP_OpenW
6f20: 72 69 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  rite;.      sqli
6f30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6f40: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
6f50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
6f60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
6f70: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
6f80: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
6f90: 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   1, 0, 0, 0);.  
6fa0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
6fb0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
6fc0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  pParse);.  }.}..
6fd0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
6fe0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
6ff0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
7000: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
7010: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
7020: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7040: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7050: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7060: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7070: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7080: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7090: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
70a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
70b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
70c0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
70d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
70e0: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
70f0: 70 53 65 6c 65 63 74 20 20 20 20 2f 2a 20 41 20  pSelect    /* A 
7100: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7110: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
7120: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
7130: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e  /.){.  Token sEn
7140: 64 3b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  d;.  Table *p;. 
7150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7160: 20 20 69 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b    int n, offset;
7170: 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54  ..  sqliteStartT
7180: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
7190: 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  gin, pName, 0);.
71a0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
71b0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
71c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
71d0: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
71e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
71f0: 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 67 6e  rn;.  }.  /* Ign
7200: 6f 72 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ore ORDER BY cla
7210: 75 73 65 73 20 6f 6e 20 61 20 53 45 4c 45 43 54  uses on a SELECT
7220: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
7230: 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
7240: 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73     sqliteExprLis
7250: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 2d  tDelete(pSelect-
7260: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7270: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
7280: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  y = 0;.  }.  p->
7290: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
72a0: 74 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  t;.  if( !pParse
72b0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
72c0: 20 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77    if( sqliteView
72d0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
72e0: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
72f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7300: 0a 20 20 7d 0a 20 20 73 45 6e 64 20 3d 20 70 50  .  }.  sEnd = pP
7310: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
7320: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
7330: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
7340: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
7350: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
7360: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
7370: 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45  ;.  n = ((int)sE
7380: 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65  nd.z) - (int)pBe
7390: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42  gin->z;.  z = pB
73a0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
73b0: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
73c0: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
73d0: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
73e0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
73f0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
7400: 20 3d 20 31 3b 0a 20 20 7a 20 3d 20 70 2d 3e 70   = 1;.  z = p->p
7410: 53 65 6c 65 63 74 2d 3e 7a 53 65 6c 65 63 74 20  Select->zSelect 
7420: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
7430: 7a 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 20 29  z, n);.  if( z )
7440: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
7450: 28 69 6e 74 29 7a 29 20 2d 20 28 69 6e 74 29 70  (int)z) - (int)p
7460: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 20 20 73 71  Begin->z;.    sq
7470: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
7480: 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74  rings(p->pSelect
7490: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  , offset);.    s
74a0: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50  qliteEndTable(pP
74b0: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
74c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
74d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ../*.** The Tabl
74e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
74f0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
7500: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
7510: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
7520: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
7530: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
7540: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
7550: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7560: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
7570: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
7580: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
7590: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
75a0: 50 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  Pare->zErrMsg..*
75b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77  /.int sqliteView
75c0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
75d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
75e0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
75f0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7600: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
7610: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
7620: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
7630: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
7640: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
7650: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
7660: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
7670: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
7680: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
7690: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
76a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
76b0: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
76c0: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
76d0: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
76e0: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
76f0: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
7700: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
7710: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
7720: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
7730: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
7740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
7750: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
7760: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
7770: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
7780: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
7790: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
77a0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
77b0: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
77c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
77d0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
77e0: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
77f0: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
7800: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
7810: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
7820: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
7830: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7840: 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c  , "view ", pTabl
7850: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
7860: 20 20 20 22 20 69 73 20 63 69 72 63 75 6c 61 72     " is circular
7870: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b  ly defined", 0);
7880: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7890: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
78a0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
78b0: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
78c0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
78d0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
78e0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
78f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
7900: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20  ble->pSelect ); 
7910: 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74  /* If nCol==0, t
7920: 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20  hen pTable must 
7930: 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70  be a VIEW */.  p
7940: 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53  Sel = pTable->pS
7950: 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74  elect;..  /* Not
7960: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
7970: 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53  to sqliteResultS
7980: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
7990: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
79a0: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
79b0: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
79c0: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
79d0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
79e0: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
79f0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
7a00: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
7a10: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
7a20: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
7a30: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
7a40: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
7a50: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
7a60: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
7a70: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
7a80: 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74  prListDup(pEList
7a90: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70  );.  if( pSel->p
7aa0: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
7ab0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
7ac0: 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72  EList;.    retur
7ad0: 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  n 1;  /* Malloc 
7ae0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
7af0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
7b00: 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73  1;.  pSelTab = s
7b10: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
7b20: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
7b30: 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70  , pSel);.  if( p
7b40: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73  SelTab ){.    as
7b50: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
7b60: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ol==0 );.    pTa
7b70: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
7b80: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
7b90: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
7ba0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
7bb0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
7bc0: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
7bd0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
7be0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
7bf0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
7c00: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c    pParse->db->fl
7c10: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e  ags |= SQLITE_Un
7c20: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65  resetViews;.  }e
7c30: 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  lse{.    pTable-
7c40: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e  >nCol = 0;.    n
7c50: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  Err++;.  }.  sql
7c60: 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  iteSelectUnbind(
7c70: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45  pSel);.  sqliteE
7c80: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
7c90: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
7ca0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
7cb0: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
7cc0: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
7cd0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
7ce0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
7cf0: 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a  VIEW pTable..**.
7d00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7d10: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
7d20: 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62  er any other tab
7d30: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f  le or view is mo
7d40: 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76  dified..** The v
7d50: 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20  iew passed into 
7d60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
7d70: 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74  ht depend direct
7d80: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
7d90: 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66  .** on the modif
7da0: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74  ied or deleted t
7db0: 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20  able so we need 
7dc0: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64  to clear the old
7dd0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73   column.** names
7de0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69   so that they wi
7df0: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
7e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e10: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
7e20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
7e30: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
7e40: 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  t i;.  if( pTabl
7e50: 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e  e==0 || pTable->
7e60: 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74  pSelect==0 ) ret
7e70: 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  urn;.  if( pTabl
7e80: 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  e->nCol==0 ) ret
7e90: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
7ea0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
7eb0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
7ec0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
7ed0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
7ee0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
7ef0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
7f00: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
7f10: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
7f20: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  i].zType);.  }. 
7f30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
7f40: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61  le->aCol);.  pTa
7f50: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
7f60: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
7f70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
7f80: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
7f90: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
7fa0: 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  EW..*/.void sqli
7fb0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
7fc0: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61  qlite *db){.  Ha
7fd0: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
7fe0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
7ff0: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
8000: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
8010: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
8020: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
8030: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
8040: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
8050: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8060: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
8070: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
8080: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
8090: 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65      sqliteViewRe
80a0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
80b0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
80c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
80d0: 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69  SQLITE_UnresetVi
80e0: 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ews;.}../*.** Gi
80f0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
8100: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
8110: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
8120: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
8130: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
8140: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
8150: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
8160: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
8170: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
8180: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8190: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
81a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
81b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
81c0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
81d0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
81e0: 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  en(pTok);.  if( 
81f0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
8200: 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  n 0;.  pTab = sq
8210: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
8220: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
8230: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
8240: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
8250: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
8260: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
8270: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8280: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
8290: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54  , 0, .        pT
82a0: 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20  ok->z, pTok->n, 
82b0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
82c0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
82d0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
82e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
82f0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
8300: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
8310: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
8320: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
8330: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8340: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
8350: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
8360: 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61  liteDropTable(Pa
8370: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8380: 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  en *pName, int i
8390: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
83a0: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
83b0: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
83c0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
83d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
83e0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
83f0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
8400: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
8410: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
8420: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
8430: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b  (pParse, pName);
8440: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
8450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8460: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
8470: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
8480: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8490: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
84a0: 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e ", pTable->zNa
84b0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61  me, .       " ma
84c0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
84d0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
84e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
84f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
8500: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c   isView && pTabl
8510: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  e->pSelect==0 ){
8520: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8530: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8540: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
8550: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
8560: 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20   table ",.      
8570: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
8580: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8590: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
85a0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  n;.  }.  if( !is
85b0: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
85c0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
85d0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
85e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
85f0: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
8600: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 22  to delete view "
8610: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
8620: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
8630: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
8640: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
8650: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
8660: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
8670: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
8680: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
8690: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
86a0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
86b0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
86c0: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
86d0: 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61  ic VdbeOp dropTa
86e0: 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ble[] = {.      
86f0: 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  { OP_OpenWrite, 
8700: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 4d 41   0, 2,        MA
8710: 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20  STER_NAME},.    
8720: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
8730: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20     0, ADDR(9),  
8740: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
8750: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
8760: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32          0}, /* 2
8770: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
8780: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
8790: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
87a0: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
87b0: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
87c0: 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20  0}, /* 4 */.    
87d0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
87e0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
87f0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
8800: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
8810: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
8820: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
8830: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
8840: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
8850: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
8860: 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a 20 38  DR(4),  0}, /* 8
8870: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
8880: 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30 2c  nteger,    0, 0,
8890: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39          0}, /* 9
88a0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
88b0: 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c  etCookie,  0, 0,
88c0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
88d0: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
88e0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
88f0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49  0},.    };.    I
8900: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
8910: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
8920: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
8930: 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 44 72 6f  , 0);.    /* Dro
8940: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
8950: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8960: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
8970: 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 77 68  ropped */.    wh
8980: 69 6c 65 28 20 70 54 61 62 6c 65 2d 3e 70 54 72  ile( pTable->pTr
8990: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 54  igger ){.      T
89a0: 6f 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20 20 74  oken tt;.      t
89b0: 74 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  t.z = pTable->pT
89c0: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20  rigger->name;.  
89d0: 20 20 20 20 74 74 2e 6e 20 3d 20 73 74 72 6c 65      tt.n = strle
89e0: 6e 28 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  n(pTable->pTrigg
89f0: 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  er->name);.     
8a00: 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67   sqliteDropTrigg
8a10: 65 72 28 70 50 61 72 73 65 2c 20 26 74 74 2c 20  er(pParse, &tt, 
8a20: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
8a30: 28 20 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  ( !pTable->isTem
8a40: 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73 65 20  p ){.      base 
8a50: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
8a60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
8a70: 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64  ze(dropTable), d
8a80: 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ropTable);.     
8a90: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8aa0: 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20 70  eP3(v, base+2, p
8ab0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
8ac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  ;.      sqliteCh
8ad0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
8ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8af0: 43 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65  ChangeP1(v, base
8b00: 2b 39 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  +9, db->next_coo
8b10: 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kie);.    }.    
8b20: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
8b30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8b40: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
8b50: 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d  oy, pTable->tnum
8b60: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
8b70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
8b80: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
8b90: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8ba0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
8bb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8bc0: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
8bd0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54  , pIdx->tnum, pT
8be0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  able->isTemp);. 
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8c00: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
8c10: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
8c20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
8c30: 20 74 68 65 20 74 61 62 6c 65 20 28 61 6e 64 20   the table (and 
8c40: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 29  all its indices)
8c50: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
8c60: 44 52 4f 50 20 71 75 65 75 65 2e 0a 20 20 2a 2a  DROP queue..  **
8c70: 20 4f 72 2c 20 69 66 20 74 68 65 20 74 61 62 6c   Or, if the tabl
8c80: 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f 6d 6d  e was never comm
8c90: 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65 6c 65  itted, just dele
8ca0: 74 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 74  te it.  If the t
8cb0: 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 62 65  able.  ** has be
8cc0: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 61 6e 64  en committed and
8cd0: 20 69 73 20 70 6c 61 63 65 64 20 6f 6e 20 74 68   is placed on th
8ce0: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71  e pending DROP q
8cf0: 75 65 75 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  ueue, then the. 
8d00: 20 2a 2a 20 64 65 6c 65 74 65 20 77 69 6c 6c 20   ** delete will 
8d10: 6f 63 63 75 72 20 77 68 65 6e 20 73 71 6c 69 74  occur when sqlit
8d20: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
8d30: 68 61 6e 67 65 73 28 29 20 65 78 65 63 75 74 65  hanges() execute
8d40: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  s..  **.  ** Exc
8d50: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
8d60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
8d70: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
8d80: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
8d90: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
8da0: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
8db0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
8dc0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
8dd0: 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69  .    sqlitePendi
8de0: 6e 67 44 72 6f 70 54 61 62 6c 65 28 64 62 2c 20  ngDropTable(db, 
8df0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d  pTable);.    db-
8e00: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
8e10: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
8e20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
8e30: 52 65 73 65 74 41 6c 6c 28 64 62 29 3b 0a 7d 0a  ResetAll(db);.}.
8e40: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
8e50: 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
8e60: 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e   SQL table.  pIn
8e70: 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20  dex is the name 
8e80: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
8e90: 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74   and pTable is t
8ea0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
8eb0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
8ec0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
8ed0: 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
8ee0: 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
8ef0: 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
8f00: 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
8f10: 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
8f20: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
8f30: 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
8f40: 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
8f50: 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
8f60: 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
8f70: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
8f80: 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
8f90: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
8fa0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
8fb0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
8fc0: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
8fd0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8fe0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
8ff0: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
9000: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
9010: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
9020: 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
9030: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
9040: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
9050: 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
9060: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
9070: 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
9080: 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
9090: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
90a0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
90b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72  */.void sqliteCr
90c0: 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
90d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
90e0: 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
90f0: 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
9100: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
9110: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
9120: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
9130: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
9140: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
9150: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
9160: 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  table to index. 
9170: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
9180: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
9190: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
91a0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
91b0: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
91c0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
91d0: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
91e0: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
91f0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
9200: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
9210: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
9220: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
9230: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
9240: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9250: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
9260: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
9270: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
9280: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
9290: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
92a0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
92b0: 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
92c0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
92d0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
92e0: 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  dex;   /* The in
92f0: 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
9300: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
9310: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
9320: 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
9330: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
9340: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
9350: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
9360: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  st */.  sqlite *
9370: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9380: 0a 20 20 69 6e 74 20 68 69 64 65 4e 61 6d 65 20  .  int hideName 
9390: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
93a0: 44 6f 20 6e 6f 74 20 70 75 74 20 74 61 62 6c 65  Do not put table
93b0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73   name in the has
93c0: 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  h table */..  if
93d0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
93e0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
93f0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
9400: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9410: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
9420: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9430: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
9440: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
9450: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
9460: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  */.  if( pTable!
9470: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
9480: 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( pName!=0 );.  
9490: 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65    pTab =  sqlite
94a0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
94b0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
94c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
94d0: 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
94e0: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
94f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9500: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
9510: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
9520: 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
9530: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
9540: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
9550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
9560: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
9570: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
9580: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
9590: 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f   .      " may no
95a0: 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63  t have new indic
95b0: 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20  es added", 0);. 
95c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
95d0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
95e0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
95f0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
9600: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
9610: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
9620: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9630: 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
9640: 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a  e indexed", 0);.
9650: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9660: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
9670: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9680: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
9690: 73 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  s index is creat
96a0: 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64  ed while re-read
96b0: 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61 20 66  ing the schema f
96c0: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
96d0: 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74  r.  ** but the t
96e0: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
96f0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
9700: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
9710: 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a  able, it can.  *
9720: 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74  * only mean that
9730: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9740: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 72 65  this index is re
9750: 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20  ally associated 
9760: 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  with is.  ** one
9770: 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68   whose name is h
9780: 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74  idden behind a t
9790: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77  emporary table w
97a0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
97b0: 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74  e..  ** Since it
97c0: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
97d0: 20 73 75 70 70 72 65 73 73 65 64 2c 20 77 65 20   suppressed, we 
97e0: 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70  need to also sup
97f0: 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69  press the.  ** i
9800: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
9810: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
9820: 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54 65 6d  g && pTab->isTem
9830: 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  p ){.    goto ex
9840: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9850: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9860: 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
9870: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
9880: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9890: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
98a0: 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
98b0: 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
98c0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
98d0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
98e0: 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
98f0: 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
9900: 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
9910: 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
9920: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
9930: 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
9940: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9950: 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
9960: 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
9970: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
9980: 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
9990: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
99a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
99b0: 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
99c0: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
99d0: 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
99e0: 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c 20 62  ss this index, b
99f0: 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a 20  ut we will not. 
9a00: 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20 6e 61   ** store its na
9a10: 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  me in the hash t
9a20: 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65 20 68  able.  Set the h
9a30: 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f 20  ideName flag to 
9a40: 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a 20  accomplish.  ** 
9a50: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
9a60: 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
9a70: 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
9a80: 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
9a90: 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
9aa0: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
9ab0: 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
9ac0: 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
9ad0: 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
9ae0: 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
9af0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61  .    Index *pISa
9b00: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
9b10: 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
9b20: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
9b30: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53  /.    Table *pTS
9b40: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
9b50: 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
9b60: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
9b70: 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20  ex */.    zName 
9b80: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
9b90: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
9ba0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
9bb0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9bc0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9bd0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
9be0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
9bf0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  dex(db, zName))!
9c00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9c10: 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61 62  pISameName->pTab
9c20: 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50  le->isTemp && pP
9c30: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
9c40: 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61  {.        hideNa
9c50: 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  me = 1;.      }e
9c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9c70: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
9c80: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
9c90: 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20  index ", zName, 
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  .           " al
9cb0: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
9cc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
9cd0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
9ce0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
9cf0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
9d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9d10: 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
9d20: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
9d30: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b  b, zName))!=0 ){
9d40: 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 61 6d  .      if( pTSam
9d50: 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26 26  eName->isTemp &&
9d60: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
9d70: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64  g ){.        hid
9d80: 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20  eName = 1;.     
9d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9da0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9db0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
9dc0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
9dd0: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
9de0: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
9df0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
9e00: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9e10: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
9e20: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9e30: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9e40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
9e50: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
9e60: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
9e70: 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
9e80: 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
9e90: 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
9ea0: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
9eb0: 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
9ec0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
9ed0: 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  d)",n);.    zNam
9ee0: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
9ef0: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
9f00: 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e  e, "(", pTab->zN
9f10: 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78  ame, " autoindex
9f20: 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20   ", zBuf, 0);.  
9f30: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9f40: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
9f50: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68 69 64  e_index;.    hid
9f60: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
9f70: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
9f80: 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e)!=0;.  }..  /*
9f90: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
9fa0: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
9fb0: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
9fc0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
9fd0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
9fe0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
9ff0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
a000: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
a010: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
a020: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
a030: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
a040: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
a050: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a060: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
a070: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
a080: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
a090: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
a0a0: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
a0b0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
a0c0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
a0d0: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
a0e0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
a0f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
a100: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
a110: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
a120: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
a130: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
a140: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
a150: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
a160: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
a170: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
a180: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
a190: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
a1a0: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
a1b0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
a1c0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a1d0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
a1e0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
a1f0: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
a200: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
a210: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
a220: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
a230: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
a240: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
a250: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
a260: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
a270: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
a280: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
a290: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
a2a0: 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f  ex->isUnique = o
a2b0: 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 63  nError;..  /* Sc
a2c0: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
a2d0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
a2e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
a2f0: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
a300: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
a310: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
a320: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
a330: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
a340: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
a350: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
a360: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
a370: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
a380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
a390: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
a3a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
a3b0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
a3c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
a3d0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
a3e0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
a3f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
a400: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
a410: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a420: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
a430: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
a440: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
a450: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68 61  e, .        " ha
a460: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
a470: 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  d ", pList->a[i]
a480: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
a490: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a4a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
a4b0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
a4c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
a4d0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
a4e0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
a4f0: 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d  lumn[i] = j;.  }
a500: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
a510: 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
a520: 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
a530: 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
a540: 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
a550: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
a560: 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
a570: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
a580: 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65 20  in && !hideName 
a590: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
a5a0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
a5b0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69  ashInsert(&db->i
a5c0: 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e  dxHash, pIndex->
a5d0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
a5e0: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
a5f0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a600: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
a610: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
a620: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
a630: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
a640: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
a650: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
a660: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a670: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
a680: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
a690: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
a6a0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
a6b0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
a6c0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
a6d0: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
a6e0: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
a6f0: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
a700: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
a710: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
a720: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
a730: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
a740: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
a750: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
a760: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
a770: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
a780: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
a790: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
a7a0: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
a7b0: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
a7c0: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
a7d0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
a7e0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
a7f0: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
a800: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
a810: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
a820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
a830: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
a840: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
a850: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
a860: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
a870: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
a880: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
a890: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
a8a0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
a8b0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
a8c0: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
a8d0: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
a8e0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
a8f0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a900: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
a910: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
a920: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
a930: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
a940: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
a950: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
a960: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
a970: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
a980: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
a990: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
a9a0: 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  r from the pPars
a9b0: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
a9c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
a9d0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
a9e0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
a9f0: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
aa00: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
aa10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
aa20: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
aa30: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
aa40: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
aa50: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
aa60: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
aa70: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
aa80: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
aa90: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
aaa0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
aab0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
aac0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
aad0: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
aae0: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
aaf0: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
ab00: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
ab10: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
ab20: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
ab30: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
ab40: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
ab50: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
ab60: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
ab70: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
ab80: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
ab90: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
aba0: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
abb0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
abc0: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
abd0: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
abe0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
abf0: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
ac00: 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d  .  ** If pTable=
ac10: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
ac20: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
ac30: 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
ac40: 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
ac50: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
ac60: 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
ac70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
ac80: 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
ac90: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
aca0: 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
acb0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
acc0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
acd0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
ace0: 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
acf0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
ad00: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
ad10: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
ad20: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
ad30: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
ad40: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
ad50: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
ad60: 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d      int isTemp =
ad70: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a   pTab->isTemp;..
ad80: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
ad90: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ada0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
adb0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
adc0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
add0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
ade0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
adf0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ae00: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
ae10: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
ae20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ae30: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
ae40: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
ae50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
ae60: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41  angeP3(v, -1, MA
ae70: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
ae80: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
ae90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
aea0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
aeb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aec0: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
aed0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
aee0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
aef0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
af10: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
af20: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
af30: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
af40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
af50: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
af60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
af70: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
af80: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50  pIndex->zName, P
af90: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
afa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
afb0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
afc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
afd0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
afe0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
aff0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
b000: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
b010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b020: 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
b030: 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  x, 0, isTemp);. 
b040: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b050: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
b060: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74  char*)&pIndex->t
b070: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
b080: 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  ;.    pIndex->tn
b090: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
b0a0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
b0b0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
b0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b0d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b0e0: 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20  WrAux, 1, 0);.  
b0f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b100: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b110: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
b120: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
b130: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b140: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
b150: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b160: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65   }.    if( !isTe
b170: 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  mp ){.      addr
b180: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
b190: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
b1a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
b1b0: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
b1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
b1d0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
b1e0: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
b1f0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 1;.        sql
b200: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b210: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
b220: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  >z, n);.      }.
b230: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
b250: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
b260: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b270: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
b280: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
b290: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c   }.    if( pTabl
b2a0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
b2b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73  eVdbeAddOp(v, is
b2c0: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75  Temp ? OP_OpenAu
b2d0: 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20  x : OP_Open, 2, 
b2e0: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
b2f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b300: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
b310: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
b320: 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  TIC);.      lbl2
b330: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
b340: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
b350: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b360: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
b370: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
b380: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
b390: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
b3a0: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
b3b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
b3c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
b3d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b3e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b3f0: 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65  Column, 2, pInde
b400: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  x->aiColumn[i]);
b410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b420: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b430: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
b440: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
b450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b460: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b470: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
b480: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
b490: 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  _None);.      sq
b4a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b4b0: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
b4c0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b4d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b4e0: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
b4f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b500: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
b510: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b520: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b530: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
b540: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
b550: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
b560: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
b570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61         sqliteCha
b580: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20  ngeCookie(db);. 
b590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b5a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b5b0: 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63  eger, db->next_c
b5c0: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
b5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b5e0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
b5f0: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 0, 0);.     
b600: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b610: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b620: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
b630: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
b640: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
b650: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
b660: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
b670: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
b680: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
b690: 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  ex:.  sqliteIdLi
b6a0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
b6b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
b6c0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
b6d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b6e0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
b6f0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
b700: 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
b710: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
b720: 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
b730: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
b740: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
b750: 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
b760: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
b770: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
b780: 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  ndex;.  char *zN
b790: 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ame;.  Vdbe *v;.
b7a0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
b7b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
b7c0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
b7d0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
b7e0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
b7f0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
b800: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
b810: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
b820: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
b830: 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  urn;.  pIndex = 
b840: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
b850: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
b860: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
b870: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
b880: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
b890: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
b8a0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
b8b0: 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c  uch index: ", 0,
b8c0: 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d   .        pName-
b8d0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
b8e0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
b8f0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
b900: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
b910: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
b920: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
b930: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
b940: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
b950: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
b960: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
b970: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
b980: 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d  beOp dropIndex[]
b990: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
b9a0: 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32  OpenWrite,  0, 2
b9b0: 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e  ,       MASTER_N
b9c0: 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  AME},.      { OP
b9d0: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
b9e0: 41 44 44 52 28 31 30 29 2c 30 7d 2c 20 0a 20 20  ADDR(10),0}, .  
b9f0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
ba00: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
ba10: 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20   0}, /* 2 */.   
ba20: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
ba30: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
ba40: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
ba50: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
ba60: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 20         0}, /* 4 
ba70: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
ba80: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
ba90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
baa0: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
bab0: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
bac0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
bad0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
bae0: 34 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  4), 0},.      { 
baf0: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
bb00: 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c 0a 20  , ADDR(10),0},. 
bb10: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
bb20: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
bb30: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
bb40: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
bb50: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
bb60: 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20   0}, /* 10 */.  
bb70: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
bb80: 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ie,  0, 0,      
bb90: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
bba0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30  Close,      0, 0
bbb0: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
bbc0: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
bbd0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
bbe0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
bbf0: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65  e;..    sqliteBe
bc00: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
bc10: 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  n(pParse, 0);.  
bc20: 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73 54    if( !pTab->isT
bc30: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73  emp ){.      bas
bc40: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
bc50: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
bc60: 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c  Size(dropIndex),
bc70: 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20   dropIndex);.   
bc80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
bc90: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c  ngeP3(v, base+2,
bca0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
bcb0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
bcc0: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
bcd0: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20  okie(db);.      
bce0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
bcf0: 50 31 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64  P1(v, base+10, d
bd00: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b  b->next_cookie);
bd10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bd20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
bd30: 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78  _Destroy, pIndex
bd40: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73  ->tnum, pTab->is
bd50: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
bd60: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
bd70: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
bd80: 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 69  .  /* Move the i
bd90: 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65 20 70 65  ndex onto the pe
bda0: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
bdb0: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e  .  Or, if the in
bdc0: 64 65 78 20 77 61 73 0a 20 20 2a 2a 20 6e 65 76  dex was.  ** nev
bdd0: 65 72 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75  er committed, ju
bde0: 73 74 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49  st delete it.  I
bdf0: 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 70 65  ndices on the pe
be00: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
be10: 0a 20 20 2a 2a 20 67 65 74 20 64 65 6c 65 74 65  .  ** get delete
be20: 64 20 62 79 20 73 71 6c 69 74 65 43 6f 6d 6d 69  d by sqliteCommi
be30: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
be40: 28 29 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  () when the user
be50: 20 65 78 65 63 75 74 65 73 0a 20 20 2a 2a 20 61   executes.  ** a
be60: 20 43 4f 4d 4d 49 54 2e 20 20 4f 72 20 69 66 20   COMMIT.  Or if 
be70: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
be80: 73 2c 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  s, the elements 
be90: 6f 66 20 74 68 65 20 44 52 4f 50 20 71 75 65 75  of the DROP queu
bea0: 65 0a 20 20 2a 2a 20 61 72 65 20 6d 6f 76 65 64  e.  ** are moved
beb0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d   back into the m
bec0: 61 69 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  ain hash table..
bed0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
bee0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
bef0: 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67     sqlitePending
bf00: 44 72 6f 70 49 6e 64 65 78 28 64 62 2c 20 70 49  DropIndex(db, pI
bf10: 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ndex);.    db->f
bf20: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
bf30: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
bf40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  }.}../*.** Appen
bf50: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
bf60: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
bf70: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
bf80: 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
bf90: 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
bfa0: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
bfb0: 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
bfc0: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
bfd0: 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
bfe0: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
bff0: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
c000: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
c010: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c020: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c030: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
c040: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
c050: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
c060: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
c070: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49    if( (pList->nI
c080: 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  d & 7)==0 ){.   
c090: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
c0a0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20  tem *a;.    a = 
c0b0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
c0c0: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
c0d0: 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c  nId+8)*sizeof(pL
c0e0: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
c0f0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
c100: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
c110: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c120: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c130: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
c140: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
c150: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
c160: 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
c170: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c180: 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  ));.  if( pToken
c190: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
c1a0: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
c1b0: 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b  ist->nId].zName;
c1c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
c1d0: 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e  tring(pz, pToken
c1e0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
c1f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
c200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c210: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
c220: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
c230: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
c240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
c250: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
c260: 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e  }.  }.  pList->n
c270: 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
c280: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
c290: 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
c2a0: 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
c2b0: 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
c2c0: 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
c2d0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
c2e0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
c2f0: 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
c300: 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
c310: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
c320: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
c330: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
c340: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
c350: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
c360: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53  SrcList *sqliteS
c370: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
c380: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
c390: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
c3a0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
c3b0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
c3c0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c3d0: 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
c3e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
c3f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c400: 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 20 26  ( (pList->nSrc &
c410: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   7)==0 ){.    st
c420: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
c430: 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71  m *a;.    a = sq
c440: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
c450: 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 53  t->a, (pList->nS
c460: 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69  rc+8)*sizeof(pLi
c470: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
c480: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c490: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
c4a0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c4c0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
c4d0: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
c4e0: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
c4f0: 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
c500: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c510: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
c520: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
c530: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
c540: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d  List->nSrc].zNam
c550: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
c560: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
c570: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
c580: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
c590: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
c5a0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
c5b0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
c5c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
c5d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c5e0: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
c5f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
c600: 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
c610: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
c620: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
c630: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
c640: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
c650: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
c660: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
c670: 69 74 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69  iteSrcListAddAli
c680: 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
c690: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
c6a0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
c6b0: 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
c6c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
c6d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a  List->nSrc - 1;.
c6e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
c6f0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
c700: 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e  ].zAlias, pToken
c710: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
c720: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
c730: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
c740: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d  ].zAlias);.  }.}
c750: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c760: 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
c770: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65  d sqliteIdListDe
c780: 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
c790: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
c7a0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
c7b0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
c7c0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
c7d0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
c7e0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
c7f0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
c800: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
c810: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
c820: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
c830: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
c840: 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
c850: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
c860: 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
c870: 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
c880: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
c890: 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49  iteIdListIndex(I
c8a0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
c8b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
c8c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
c8d0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
c8e0: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
c8f0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
c900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
c910: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
c920: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
c930: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
c940: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
c950: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
c960: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
c970: 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
c980: 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
c990: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
c9a0: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
c9b0: 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
c9c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
c9d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
c9e0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
c9f0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
ca00: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
ca10: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
ca20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
ca30: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
ca40: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
ca50: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
ca60: 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
ca70: 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
ca80: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
ca90: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
caa0: 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  le(0, pList->a[i
cab0: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
cac0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
cad0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
cae0: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
caf0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
cb00: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e  (pList->a[i].pOn
cb10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c  );.    sqliteIdL
cb20: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
cb30: 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
cb40: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
cb50: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
cb60: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
cb70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50  }../*.** The COP
cb80: 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72  Y command is for
cb90: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
cba0: 69 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61  ith PostgreSQL a
cbb0: 6e 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79  nd specificially
cbc0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c  .** for the abil
cbd0: 69 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20  ity to read the 
cbe0: 6f 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d  output of pg_dum
cbf0: 70 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69  p.  The format i
cc00: 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a  s as.** follows:
cc10: 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74  .**.**    COPY t
cc20: 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b  able FROM file [
cc30: 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53  USING DELIMITERS
cc40: 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22   string].**.** "
cc50: 74 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69  table" is an exi
cc60: 73 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  sting table name
cc70: 2e 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20  .  We will read 
cc80: 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72  lines of code fr
cc90: 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69  om.** file to fi
cca0: 6c 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69  ll this table wi
ccb0: 74 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d  th data.  File m
ccc0: 69 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e  ight be "stdin".
ccd0: 20 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a    The optional.*
cce0: 2a 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69  * delimiter stri
ccf0: 6e 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  ng identifies th
cd00: 65 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f  e field separato
cd10: 72 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  rs.  The default
cd20: 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f   is a tab..*/.vo
cd30: 69 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20  id sqliteCopy(. 
cd40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cd50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
cd60: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cd70: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
cd80: 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  me,   /* The nam
cd90: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  e of the table i
cda0: 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c  nto which we wil
cdb0: 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f  l insert */.  To
cdc0: 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20  ken *pFilename, 
cdd0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
cde0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74  rom which to obt
cdf0: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ain information 
ce00: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c  */.  Token *pDel
ce10: 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65  imiter,   /* Use
ce20: 20 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65   this as the fie
ce30: 6c 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a  ld delimiter */.
ce40: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20    int onError   
ce50: 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
ce60: 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72  o do if a constr
ce70: 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b  aint fails */.){
ce80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
ce90: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20    char *zTab;.  
cea0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76  int i;.  Vdbe *v
ceb0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e  ;.  int addr, en
cec0: 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  d;.  Index *pIdx
ced0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
cee0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
cef0: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62  zTab = sqliteTab
cf00: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
cf10: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69  pTableName);.  i
cf20: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
cf30: 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d  _failed || zTab=
cf40: 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63  =0 ) goto copy_c
cf50: 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d  leanup;.  pTab =
cf60: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
cf70: 54 6f 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ToTable(pParse, 
cf80: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  zTab);.  sqliteF
cf90: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28  ree(zTab);.  if(
cfa0: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
cfb0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
cfc0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
cfd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
cfe0: 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70   v ){.    int op
cff0: 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  enOp;.    sqlite
d000: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d010: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  ion(pParse, 1);.
d020: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d030: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d040: 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29  _FileOpen, 0, 0)
d050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d060: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
d070: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20  , pFilename->z, 
d080: 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20  pFilename->n);. 
d090: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
d0a0: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
d0b0: 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54  .    openOp = pT
d0c0: 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f  ab->isTemp ? OP_
d0d0: 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f  OpenWrAux : OP_O
d0e0: 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71  penWrite;.    sq
d0f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d100: 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62   openOp, 0, pTab
d110: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
d120: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d130: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
d140: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
d150: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
d160: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d170: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d180: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
d190: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d1a0: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69  dOp(v, openOp, i
d1b0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
d1c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
d1d0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
d1e0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
d1f0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
d200: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
d210: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
d220: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
d230: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d240: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
d250: 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
d260: 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a   the row count *
d270: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20  /.    }.    end 
d280: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
d290: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64  Label(v);.    ad
d2a0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
d2b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52  ddOp(v, OP_FileR
d2c0: 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ead, pTab->nCol,
d2d0: 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70   end);.    if( p
d2e0: 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20  Delimiter ){.   
d2f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d300: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
d310: 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44  Delimiter->z, pD
d320: 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20  elimiter->n);.  
d330: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
d340: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
d350: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d360: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d370: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22  ngeP3(v, addr, "
d380: 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  \t", 1);.    }. 
d390: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b     if( pTab->iPK
d3a0: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ey>=0 ){.      s
d3b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d3c0: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
d3d0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29   pTab->iPKey, 0)
d3e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d3f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
d400: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
d410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d420: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d430: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
d440: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
d450: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
d460: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
d470: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
d480: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
d490: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
d4a0: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  r primary key co
d4b0: 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77  lumn is filled w
d4c0: 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69  ith NULL since i
d4d0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  ts.        ** va
d4e0: 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75  lue is always pu
d4f0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  lled from the re
d500: 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  cord number */. 
d510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
d520: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
d530: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
d540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d550: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d560: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
d570: 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, i, 0);.      
d580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d590: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
d5a0: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
d5b0: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30  e, pTab, 0, 0, 0
d5c0: 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64  , 0, onError, ad
d5d0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  dr);.    sqliteC
d5e0: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
d5f0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
d600: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
d610: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
d620: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
d630: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)!=0 ){.      s
d640: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d650: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
d660: 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  0);  /* Incremen
d670: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
d680: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
d690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
d6a0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
d6b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
d6c0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
d6d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d6e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
d6f0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
d700: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
d710: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
d720: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
d730: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
d740: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
d750: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d760: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
d770: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
d780: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d790: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30  OP_ColumnName, 0
d7a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d7b0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
d7c0: 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65  , -1, "rows inse
d7d0: 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43  rted", P3_STATIC
d7e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
d7f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d800: 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a  allback, 1, 0);.
d810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70      }.  }.  .cop
d820: 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74  y_cleanup:.  ret
d830: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
d840: 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56  e non-standard V
d850: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73  ACUUM command is
d860: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
d870: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  p the database,.
d880: 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65  ** collapse free
d890: 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74   space, etc.  It
d8a0: 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74   is modelled aft
d8b0: 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f  er the VACUUM co
d8c0: 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74  mmand.** in Post
d8d0: 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e  greSQL..**.** In
d8e0: 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20 6f   version 1.0.x o
d8f0: 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56 41  f SQLite, the VA
d900: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f 75  CUUM command wou
d910: 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f  ld call.** gdbm_
d920: 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e 20  reorganize() on 
d930: 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  all the database
d940: 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62 65   tables.  But be
d950: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
d960: 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e 6f  2.0.0, SQLite no
d970: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44 42   longer uses GDB
d980: 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e  M so this comman
d990: 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65 20  d has.** become 
d9a0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64  a no-op..*/.void
d9b0: 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61   sqliteVacuum(Pa
d9c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
d9d0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b  en *pTableName){
d9e0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
d9f0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   */.}../*.** Beg
da00: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
da10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
da20: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
da30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
da40: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
da50: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
da60: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
da70: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
da80: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
da90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
daa0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
dab0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
dac0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
dad0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
dae0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
daf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
db00: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
db10: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29  ation(pParse, 0)
db20: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
db30: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b   SQLITE_InTrans;
db40: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
db50: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
db60: 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
db70: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
db80: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e  sqliteCommitTran
db90: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
dba0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
dbb0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
dbc0: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
dbd0: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
dbe0: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
dbf0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
dc00: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
dc10: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
dc20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
dc30: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
dc40: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
dc50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e  ) return;.  db->
dc60: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
dc70: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69  _InTrans;.  sqli
dc80: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
dc90: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64  ion(pParse);.  d
dca0: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
dcb0: 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
dcc0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
dcd0: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
dce0: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54   sqliteRollbackT
dcf0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
dd00: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
dd10: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
dd20: 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
dd30: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
dd40: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
dd50: 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72  ->pBe==0 ) retur
dd60: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
dd70: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
dd80: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
dd90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
dda0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
ddb0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20  E_InTrans)==0 ) 
ddc0: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
ddd0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
dde0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
ddf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
de00: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
de10: 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
de20: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
de30: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
de40: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
de50: 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
de60: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
de70: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
de80: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
de90: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
dea0: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
deb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
dec0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ded0: 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
dee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
def0: 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
df00: 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
df10: 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
df20: 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
df30: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
df40: 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
df50: 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
df60: 66 20 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f  f the setCheckpo
df70: 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  int parameter is
df80: 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
df90: 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
dfa0: 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
dfb0: 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
dfc0: 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
dfd0: 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
dfe0: 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
dff0: 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
e000: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
e010: 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
e020: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
e030: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
e040: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
e050: 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
e060: 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
e070: 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
e080: 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
e090: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
e0a0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
e0b0: 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
e0c0: 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
e0d0: 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
e0e0: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
e0f0: 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
e100: 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
e110: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
e120: 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
e130: 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43  pParse, int setC
e140: 68 65 63 6b 70 6f 69 6e 74 29 7b 0a 20 20 56 64  heckpoint){.  Vd
e150: 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
e160: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
e170: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
e180: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e190: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
e1a0: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
e1b0: 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
e1c0: 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  igger */.  if( (
e1d0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
e1e0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
e1f0: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ns)==0 ){.    sq
e200: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e210: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
e220: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
e230: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e240: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
e250: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65  pParse->db->sche
e260: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  ma_cookie, 0);. 
e270: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
e280: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
e290: 20 7d 65 6c 73 65 20 69 66 28 20 73 65 74 43 68   }else if( setCh
e2a0: 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  eckpoint ){.    
e2b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e2c0: 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
e2d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
e2e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e2f0: 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64  ode that conclud
e300: 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  es an operation 
e310: 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63 68  that may have ch
e320: 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74  anged.** the dat
e330: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
e340: 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63  a companion func
e350: 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72 69  tion to BeginWri
e360: 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a 2a  teOperation()..*
e370: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
e380: 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
e390: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e 20  then commit it. 
e3a0: 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74   If a checkpoint
e3b0: 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64 20   was.** started 
e3c0: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61 74  then commit that
e3d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e3e0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
e3f0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
e400: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
e410: 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  f( pParse->trigS
e420: 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f  tack ) return; /
e430: 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20  * if this is in 
e440: 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76  a trigger */.  v
e450: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
e460: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e470: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e480: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
e490: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
e4a0: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f  InTrans ){.    /
e4b0: 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do Nothing */.
e4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
e4d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e4e0: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  OP_Commit, 0, 0)
e4f0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
e500: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
e510: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
e520: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
e530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
e540: 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29  Boolean(char *z)
e550: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
e560: 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79  *azTrue[] = { "y
e570: 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65  es", "on", "true
e580: 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
e590: 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
e5a0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
e5b0: 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
e5c0: 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
e5d0: 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
e5e0: 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
e5f0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
e600: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75  ; i<sizeof(azTru
e610: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65  e)/sizeof(azTrue
e620: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
e630: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
e640: 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d  p(z,azTrue[i])==
e650: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
e660: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
e670: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
e680: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
e690: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d  t.  .**.** Pragm
e6a0: 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66  as are of this f
e6b0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
e6c0: 50 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75  PRAGMA id = valu
e6d0: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e  e.**.** The iden
e6e0: 74 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73  tifier might als
e6f0: 6f 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20  o be a string.  
e700: 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  The value is a s
e710: 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64  tring, and.** id
e720: 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e  entifier, or a n
e730: 75 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73  umber.  If minus
e740: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
e750: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a  en the value is.
e760: 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74  ** a number that
e770: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
e780: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
e790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61  /.void sqlitePra
e7a0: 67 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  gma(Parse *pPars
e7b0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c  e, Token *pLeft,
e7c0: 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20   Token *pRight, 
e7d0: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
e7e0: 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20    char *zLeft = 
e7f0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  0;.  char *zRigh
e800: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20  t = 0;.  sqlite 
e810: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e820: 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c  ;..  zLeft = sql
e830: 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74  iteStrNDup(pLeft
e840: 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a  ->z, pLeft->n);.
e850: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
e860: 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69  zLeft);.  if( mi
e870: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a  nusFlag ){.    z
e880: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73  Right = 0;.    s
e890: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
e8a0: 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c  &zRight, "-", 1,
e8b0: 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67   pRight->z, pRig
e8c0: 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  ht->n, 0);.  }el
e8d0: 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d  se{.    zRight =
e8e0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
e8f0: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
e900: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
e910: 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b  Dequote(zRight);
e920: 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a  .  }. .  /*.  **
e930: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
e940: 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  _cache_size.  **
e950: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
e960: 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20  _cache_size=N.  
e970: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
e980: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
e990: 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69  he current persi
e9a0: 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  stent setting fo
e9b0: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
e9c0: 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65  cache size.  The
e9d0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
e9e0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
e9f0: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
ea00: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
ea10: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
ea20: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74  nd form sets bot
ea30: 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  h the current.  
ea40: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
ea50: 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  ze value and the
ea60: 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65   persistent page
ea70: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
ea80: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
ea90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
eaa0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
eab0: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
eac0: 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69  size is stored i
ead0: 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f  n meta-value 2 o
eae0: 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a  f page 1 of the.
eaf0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
eb00: 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65 20 73  le.  The cache s
eb10: 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ize is actually 
eb20: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
eb30: 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  ue of.  ** this 
eb40: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
eb50: 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65    The sign of me
eb60: 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72  ta-value 2 deter
eb70: 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  mines the.  ** s
eb80: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
eb90: 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  ng.  A negative 
eba0: 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63  value means sync
ebb0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20  hronous is off. 
ebc0: 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69   ** and a positi
ebd0: 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73  ve value means s
ebe0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
ebf0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
ec00: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
ec10: 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  ,"default_cache_
ec20: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
ec30: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
ec40: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
ec50: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  {.      { OP_Rea
ec60: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
ec70: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
ec80: 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20   { OP_AbsValue, 
ec90: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
eca0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
ecb0: 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  up,         0, 0
ecc0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
ecd0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
ece0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
ecf0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
ed00: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Ne,          0,
ed10: 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   6,        0},. 
ed20: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
ed30: 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53  r,     MAX_PAGES
ed40: 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ,0, 0},.      { 
ed50: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
ed60: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
ed70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
ed80: 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
ed90: 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a        "cache_siz
eda0: 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e"},.      { OP_
edb0: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
edc0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
edd0: 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
ede0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
edf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
ee00: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
ee10: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
ee20: 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
ee30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ee40: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
ee50: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
ee60: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
ee70: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
ee80: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
ee90: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
eea0: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
eeb0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
eec0: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
eed0: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
eee0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
eef0: 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
ef00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ef10: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ef20: 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20   size, 0);.     
ef30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ef40: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
ef50: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
ef60: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
ef70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ef80: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
ef90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
efa0: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
efb0: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
efc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
efd0: 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30  , OP_Negative, 0
efe0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
eff0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f000: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
f010: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f020: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
f030: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  n(pParse);.     
f040: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
f050: 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
f060: 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a  <0 ? -size : siz
f070: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
f080: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
f090: 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61  (db->pBe, db->ca
f0a0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
f0b0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20  .  }else..  /*. 
f0c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68   **  PRAGMA cach
f0d0: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
f0e0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 4e  GMA cache_size=N
f0f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
f100: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
f110: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
f120: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
f130: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
f140: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 6c  che size.  The l
f150: 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 63 61 6e  ocal setting can
f160: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72   be different fr
f170: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 73  om.  ** the pers
f180: 69 73 74 65 6e 74 20 63 61 63 68 65 20 73 69 7a  istent cache siz
f190: 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20  e value that is 
f1a0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
f1b0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
f1c0: 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20 76 61   itself.  The va
f1d0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
f1e0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
f1f0: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
f200: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
f210: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
f220: 66 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c 6f  form sets the lo
f230: 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  cal.  ** page ca
f240: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20  che size value. 
f250: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68 61   It does not cha
f260: 6e 67 65 20 74 68 65 20 70 65 72 73 69 73 74 65  nge the persiste
f270: 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65 20 73 69  nt.  ** cache si
f280: 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ze stored on the
f290: 20 64 69 73 6b 20 73 6f 20 74 68 65 20 63 61 63   disk so the cac
f2a0: 68 65 20 73 69 7a 65 20 77 69 6c 6c 20 72 65 76  he size will rev
f2b0: 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73 20  ert.  ** to its 
f2c0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 68  default value wh
f2d0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
f2e0: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72 65  is closed and re
f2f0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20 73  opened..  ** N s
f300: 68 6f 75 6c 64 20 62 65 20 61 20 70 6f 73 69 74  hould be a posit
f310: 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a  ive integer..  *
f320: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
f330: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63  rICmp(zLeft,"cac
f340: 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  he_size")==0 ){.
f350: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
f360: 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d  p getCacheSize[]
f370: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
f380: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20  ColumnCount, 1, 
f390: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
f3a0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
f3b0: 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
f3c0: 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d     "cache_size"}
f3d0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
f3e0: 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
f3f0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
f400: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
f410: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
f420: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
f430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f440: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
f450: 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
f460: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62     int size = db
f470: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20  ->cache_size;;. 
f480: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
f490: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
f4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f4b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f4c0: 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20  ger, size, 0);. 
f4d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f4e0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f4f0: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
f500: 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
f510: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f520: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
f530: 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  atoi(zRight);.  
f540: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
f550: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
f560: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61 63       if( db->cac
f570: 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  he_size<0 ) size
f580: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
f590: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  db->cache_size =
f5a0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
f5b0: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
f5c0: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62  Size(db->pBe, db
f5d0: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
f5e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
f5f0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
f600: 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e  default_synchron
f610: 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ous.  **  PRAGMA
f620: 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f   default_synchro
f630: 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a  nous=BOOLEAN.  *
f640: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
f650: 20 66 6f 72 6d 20 72 65 74 75 72 6e 73 20 74 68   form returns th
f660: 65 20 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c  e persistent val
f670: 75 65 20 6f 66 20 74 68 65 20 22 73 79 6e 63 68  ue of the "synch
f680: 72 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e 67 0a  ronous" setting.
f690: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 74 6f    ** that is sto
f6a0: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
f6b0: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 74 68  ase.  This is th
f6c0: 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65  e synchronous se
f6d0: 74 74 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20  tting that.  ** 
f6e0: 69 73 20 75 73 65 64 20 77 68 65 6e 65 76 65 72  is used whenever
f6f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
f700: 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f   opened unless o
f710: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 73  verridden by a s
f720: 65 70 61 72 61 74 65 0a 20 20 2a 2a 20 22 73 79  eparate.  ** "sy
f730: 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d  nchronous" pragm
f740: 61 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  a.  The second f
f750: 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20  orm changes the 
f760: 70 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20 74  persistent and t
f770: 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79  he.  ** local sy
f780: 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e  nchronous settin
f790: 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67  g to the value g
f7a0: 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iven..  **.  ** 
f7b0: 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  If synchronous i
f7c0: 73 20 6f 6e 2c 20 53 51 4c 69 74 65 20 77 69 6c  s on, SQLite wil
f7d0: 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  l do an fsync() 
f7e0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 74 20 73  system call at s
f7f0: 74 72 61 74 65 67 69 63 0a 20 20 2a 2a 20 70 6f  trategic.  ** po
f800: 69 6e 74 73 20 74 6f 20 69 6e 73 75 72 65 20 74  ints to insure t
f810: 68 61 74 20 61 6c 6c 20 70 72 65 76 69 6f 75 73  hat all previous
f820: 6c 79 20 77 72 69 74 74 65 6e 20 64 61 74 61 20  ly written data 
f830: 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
f840: 6e 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 6f  n.  ** written o
f850: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72  nto the disk sur
f860: 66 61 63 65 20 62 65 66 6f 72 65 20 63 6f 6e 74  face before cont
f870: 69 6e 75 69 6e 67 2e 20 20 54 68 69 73 20 6d 6f  inuing.  This mo
f880: 64 65 20 69 6e 73 75 72 65 73 20 74 68 61 74 0a  de insures that.
f890: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
f8a0: 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
f8b0: 20 69 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   in a consistent
f8c0: 20 73 74 61 74 65 20 65 76 65 6e 74 20 69 66 20   state event if 
f8d0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20  the operating.  
f8e0: 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ** system crashe
f8f0: 73 20 6f 72 20 70 6f 77 65 72 20 74 6f 20 74 68  s or power to th
f900: 65 20 63 6f 6d 70 75 74 65 72 20 69 73 20 69 6e  e computer is in
f910: 74 65 72 72 75 70 74 65 64 20 75 6e 65 78 70 65  terrupted unexpe
f920: 63 74 65 64 6c 79 2e 0a 20 20 2a 2a 20 57 68 65  ctedly..  ** Whe
f930: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
f940: 20 6f 66 66 2c 20 53 51 4c 69 74 65 20 77 69 6c   off, SQLite wil
f950: 6c 20 6e 6f 74 20 77 61 69 74 20 66 6f 72 20 63  l not wait for c
f960: 68 61 6e 67 65 73 20 74 6f 20 61 63 74 75 61 6c  hanges to actual
f970: 6c 79 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ly.  ** be writt
f980: 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 62  en to the disk b
f990: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
f9a0: 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 69 74  .  As soon as it
f9b0: 20 68 61 6e 64 73 20 63 68 61 6e 67 65 73 0a 20   hands changes. 
f9c0: 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65 72 61   ** to the opera
f9d0: 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 69 74 20  ting system, it 
f9e0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
f9f0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 70 65 72   changes are per
fa00: 6d 61 6e 65 6e 74 20 61 6e 64 0a 20 20 2a 2a 20  manent and.  ** 
fa10: 69 74 20 63 6f 6e 74 69 6e 75 65 73 20 67 6f 69  it continues goi
fa20: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  ng.  The databas
fa30: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
fa40: 75 70 74 65 64 20 62 79 20 61 20 70 72 6f 67 72  upted by a progr
fa50: 61 6d 20 63 72 61 73 68 0a 20 20 2a 2a 20 65 76  am crash.  ** ev
fa60: 65 6e 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e  en with synchron
fa70: 6f 75 73 20 6f 66 66 2c 20 62 75 74 20 61 6e 20  ous off, but an 
fa80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
fa90: 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
faa0: 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f 75 6c 64 20  loss.  ** could 
fab0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63 6f 72 72  potentially corr
fac0: 75 70 74 20 64 61 74 61 2e 20 20 4f 6e 20 74 68  upt data.  On th
fad0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 73 79  e other hand, sy
fae0: 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66 20 69 73  nchronous off is
faf0: 0a 20 20 2a 2a 20 66 61 73 74 65 72 20 74 68 61  .  ** faster tha
fb00: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 6e  n synchronous on
fb10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
fb20: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
fb30: 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72  ,"default_synchr
fb40: 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20  onous")==0 ){.  
fb50: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
fb60: 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20  getSync[] = {.  
fb70: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
fb80: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
fb90: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
fba0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30  P_ReadCookie,  0
fbb0: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
fbc0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
fbd0: 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  er,     0, 0,   
fbe0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
fbf0: 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20 20   OP_Lt,         
fc00: 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30 7d   0, 5,        0}
fc10: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64  ,.      { OP_Add
fc20: 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20  Imm,      1, 0, 
fc30: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
fc40: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
fc50: 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
fc60: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
fc70: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
fc80: 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72  ,        "synchr
fc90: 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b  onous"},.      {
fca0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
fcb0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
fcc0: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
fcd0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
fce0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fcf0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
fd00: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69  urn;.    if( pRi
fd10: 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
fd20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fd30: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
fd40: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79   ArraySize(getSy
fd50: 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20  nc), getSync);. 
fd60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd70: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
fd80: 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63  int size = db->c
fd90: 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20  ache_size;.     
fda0: 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
fdb0: 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
fdc0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
fdd0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
fde0: 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  se, 0);.      sq
fdf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fe00: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
fe10: 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 2);.      sql
fe20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fe30: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
fe40: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
fe50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fe60: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
fe70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
fe80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
fe90: 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  , 0, addr+3);.  
fea0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
feb0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
fec0: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 30 29 3b  , MAX_PAGES, 0);
fed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
fee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73  eAddOp(v, OP_Abs
fef0: 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Value, 0, 0);.  
ff00: 20 20 20 20 69 66 28 20 21 67 65 74 42 6f 6f 6c      if( !getBool
ff10: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
ff20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ff30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
ff40: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
ff50: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 2d 73 69        size = -si
ff60: 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ze;.      }.    
ff70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ff80: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
ff90: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
ffa0: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
ffb0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
ffc0: 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
ffd0: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
ffe0: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
fff0: 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
10000 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
10010 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
10020 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
10030 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
10040 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ous.  **   PRAGM
10050 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f  A synchronous=BO
10060 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OLEAN.  **.  ** 
10070 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
10080 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
10090 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73   the synchronous
100a0 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
100b0 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  .  ** the local 
100c0 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d  value does not m
100d0 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ake changes to t
100e0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64  he disk file and
100f0 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
10100 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
10110 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78  restored the nex
10120 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
10130 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e  ase is.  ** open
10140 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ed..  */.  if( s
10150 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10160 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  ft,"synchronous"
10170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
10180 69 63 20 56 64 62 65 4f 70 20 67 65 74 53 79 6e  ic VdbeOp getSyn
10190 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  c[] = {.      { 
101a0 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
101b0 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
101c0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
101d0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
101e0 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f        "synchrono
101f0 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  us"},.      { OP
10200 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
10210 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
10220 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
10230 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10240 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
10250 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10260 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
10270 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
10280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
10290 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
102a0 65 67 65 72 2c 20 64 62 2d 3e 63 61 63 68 65 5f  eger, db->cache_
102b0 73 69 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20 20 20  size>=0, 0);.   
102c0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
102d0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
102e0 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65  ize(getSync), ge
102f0 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73  tSync);.    }els
10300 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
10310 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
10320 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ze;.      if( si
10330 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
10340 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ize;.      if( !
10350 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
10360 74 29 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  t) ) size = -siz
10370 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63  e;.      db->cac
10380 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a  he_size = size;.
10390 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
103a0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
103b0 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65  ->pBe, db->cache
103c0 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
103d0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
103e0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
103f0 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68  , "trigger_overh
10400 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b  ead_test")==0 ){
10410 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
10420 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
10430 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65       always_code
10440 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
10450 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
10460 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65       always_code
10470 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
10480 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
10490 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
104a0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76  trICmp(zLeft, "v
104b0 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  dbe_trace")==0 )
104c0 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
104d0 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
104e0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
104f0 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72  |= SQLITE_VdbeTr
10500 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ace;.    }else{.
10510 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
10520 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62 65 54  &= ~SQLITE_VdbeT
10530 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  race;.    }.  }e
10540 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
10550 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
10560 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  "full_column_nam
10570 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  es")==0 ){.    i
10580 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
10590 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
105a0 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
105b0 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
105c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
105d0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
105e0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
105f0 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  mes;.    }.  }el
10600 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
10610 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
10620 72 65 73 75 6c 74 5f 73 65 74 5f 64 65 74 61 69  result_set_detai
10630 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ls")==0 ){.    i
10640 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
10650 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
10660 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10670 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73  TE_ResultDetails
10680 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10690 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
106a0 7e 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65  ~SQLITE_ResultDe
106b0 74 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  tails;.    }.  }
106c0 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
106d0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
106e0 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22   "count_changes"
106f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
10700 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
10710 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
10720 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10730 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d  CountRows;.    }
10740 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
10750 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
10760 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20  _CountRows;.    
10770 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
10780 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10790 4c 65 66 74 2c 20 22 65 6d 70 74 79 5f 72 65 73  Left, "empty_res
107a0 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 22 29 3d  ult_callbacks")=
107b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
107c0 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
107d0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
107e0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4e 75  ags |= SQLITE_Nu
107f0 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  llCallback;.    
10800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
10810 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
10820 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a  E_NullCallback;.
10830 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
10840 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10850 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65  mp(zLeft, "table
10860 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  _info")==0 ){.  
10870 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
10880 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
10890 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
108a0 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
108b0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  t);.    if( pTab
108c0 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74   ) v = sqliteGet
108d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
108e0 20 20 69 66 28 20 70 54 61 62 20 26 26 20 76 20    if( pTab && v 
108f0 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
10900 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f  VdbeOp tableInfo
10910 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
10920 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10930 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c 20 20 20  nCount, 5, 0,   
10940 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20      0},.        
10950 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10960 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 63    0, 0,       "c
10970 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  id"},.        { 
10980 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
10990 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
109a0 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
109b0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
109c0 2c 20 30 2c 20 20 20 20 20 20 20 22 74 79 70 65  , 0,       "type
109d0 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
109e0 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 33 2c  _ColumnName,  3,
109f0 20 30 2c 20 20 20 20 20 20 20 22 6e 6f 74 6e 75   0,       "notnu
10a00 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  ll"},.        { 
10a10 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
10a20 34 2c 20 30 2c 20 20 20 20 20 20 20 22 64 66 6c  4, 0,       "dfl
10a30 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20 20 20 20  t_value"},.     
10a40 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
10a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
10a60 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
10a70 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66  raySize(tableInf
10a80 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65  oPreface), table
10a90 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20  InfoPreface);.  
10aa0 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 47 65      sqliteViewGe
10ab0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
10ac0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
10ad0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
10ae0 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
10af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10b00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10b10 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
10b20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10b30 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
10b40 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10b50 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
10b60 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
10b70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
10b80 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10b90 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
10bb0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10bc0 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
10bd0 67 65 50 33 28 76 2c 20 2d 31 2c 20 0a 20 20 20  geP3(v, -1, .   
10be0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
10bf0 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3f 20 70 54  ol[i].zType ? pT
10c00 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
10c10 65 20 3a 20 22 74 65 78 74 22 2c 20 50 33 5f 53  e : "text", P3_S
10c20 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
10c30 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10c40 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
10c50 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
10c60 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Null, 0);.      
10c70 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10c80 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
10c90 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
10ca0 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
10cb0 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61  3(v, -1, pTab->a
10cc0 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33  Col[i].zDflt, P3
10cd0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10ce0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10cf0 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
10d00 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 5, 0);.      }
10d10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
10d20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
10d30 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
10d40 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20  x_info")==0 ){. 
10d50 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
10d60 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
10d70 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
10d80 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46    pIdx = sqliteF
10d90 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69  indIndex(db, zRi
10da0 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ght);.    if( pI
10db0 64 78 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47  dx ) v = sqliteG
10dc0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10dd0 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
10de0 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  v ){.      stati
10df0 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e  c VdbeOp tableIn
10e00 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  foPreface[] = {.
10e10 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10e20 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20  umnCount, 3, 0, 
10e30 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
10e40 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10e50 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
10e60 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20  "seqno"},.      
10e70 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10e80 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
10e90 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20  "cid"},.        
10ea0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10eb0 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    2, 0,       "n
10ec0 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  ame"},.      };.
10ed0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
10ee0 20 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e     pTab = pIdx->
10ef0 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71  pTable;.      sq
10f00 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
10f10 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74  t(v, ArraySize(t
10f20 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
10f30 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  , tableInfoPrefa
10f40 63 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ce);.      for(i
10f50 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
10f60 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
10f70 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49     int cnum = pI
10f80 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
10f90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10fa0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10fb0 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
10fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10fd0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10fe0 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a  eger, cnum, 0);.
10ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11000 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
11010 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
11020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
11030 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a  b->nCol>cnum );.
11040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11050 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11060 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  , pTab->aCol[cnu
11070 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  m].zName, P3_STA
11080 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
11090 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
110a0 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c   OP_Callback, 3,
110b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
110c0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
110d0 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
110e0 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 6c 69  zLeft, "index_li
110f0 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  st")==0 ){.    I
11100 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
11110 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
11120 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54   Vdbe *v;.    pT
11130 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
11140 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29  able(db, zRight)
11150 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
11160 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  {.      v = sqli
11170 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
11180 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  );.      pIdx = 
11190 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
111a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
111b0 20 26 26 20 70 49 64 78 20 26 26 20 76 20 29 7b   && pIdx && v ){
111c0 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30  .      int i = 0
111d0 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ; .      static 
111e0 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69 73 74  VdbeOp indexList
111f0 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
11200 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11210 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20  nCount, 3, 0,   
11220 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20      0},.        
11230 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
11240 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73    0, 0,       "s
11250 65 71 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  eq"},.        { 
11260 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
11270 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
11280 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
11290 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
112a0 2c 20 30 2c 20 20 20 20 20 20 20 22 75 6e 69 71  , 0,       "uniq
112b0 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a  ue"},.      };..
112c0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
112d0 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
112e0 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74  aySize(indexList
112f0 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c  Preface), indexL
11300 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20  istPreface);.   
11310 20 20 20 77 68 69 6c 65 28 70 49 64 78 29 7b 0a     while(pIdx){.
11320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11330 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
11340 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
11350 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11360 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
11370 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
11380 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
11390 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
113a0 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
113b0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
113c0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
113d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
113e0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
113f0 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  one, 0);.       
11400 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11410 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
11420 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   3, 0);.        
11430 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ++i;.        pId
11440 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b  x = pIdx->pNext;
11450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11460 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
11470 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
11480 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11490 2c 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22  , "parser_trace"
114a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65  )==0 ){.    exte
114b0 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61  rn void sqlitePa
114c0 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c  rserTrace(FILE*,
114d0 20 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66   char *);.    if
114e0 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
114f0 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ght) ){.      sq
11500 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
11510 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a  stdout, "parser:
11520 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
11530 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73        sqlitePars
11540 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20  erTrace(0, 0);. 
11550 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
11560 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
11570 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
11580 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  "integrity_check
11590 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
115a0 74 69 63 20 56 64 62 65 4f 70 20 63 68 65 63 6b  tic VdbeOp check
115b0 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  Db[] = {.      {
115c0 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
115d0 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 32   0, 0,        "2
115e0 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  "},.      { OP_O
115f0 70 65 6e 2c 20 20 20 20 20 20 20 20 30 2c 20 32  pen,        0, 2
11600 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
11610 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
11620 20 20 20 20 20 30 2c 20 36 2c 20 20 20 20 20 20       0, 6,      
11630 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11640 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 30 2c  _Column,      0,
11650 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   3,        0},. 
11660 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
11670 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
11680 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
11690 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
116a0 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
116b0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
116c0 67 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20  grityCk, 0, 0,  
116d0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
116e0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
116f0 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 1, 0,        0
11700 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
11710 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
11720 20 20 20 20 20 20 20 20 22 69 6e 74 65 67 72 69          "integri
11730 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20  ty_check"},.    
11740 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
11750 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
11760 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
11770 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11780 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
11790 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
117a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
117b0 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
117c0 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63 68 65  v, ArraySize(che
117d0 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b  ckDb), checkDb);
117e0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20  .  }else..  {}. 
117f0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
11800 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
11810 28 7a 52 69 67 68 74 29 3b 0a 7d 0a              (zRight);.}.