/ Hex Artifact Content
Login

Artifact f4633493f57660587c35c76dc7948f5da691a718:


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 36 20 32 30 30  ild.c,v 1.96 200
0310: 32 2f 30 36 2f 31 37 20 31 37 3a 30 37 3a 32 30  2/06/17 17:07:20
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 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5360: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
5370: 6c 61 74 69 6e 67 20 74 79 70 65 20 67 69 76 65  lating type give
5380: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
5390: 74 79 70 65 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 52  type token..** R
53a0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
53b0: 66 20 74 68 65 20 74 79 70 65 20 69 73 20 75 6e  f the type is un
53c0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
53d0: 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70  sqliteCollateTyp
53e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
53f0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
5400: 20 20 69 66 28 20 70 54 79 70 65 3d 3d 30 20 29    if( pType==0 )
5410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5420: 4f 5f 55 4e 4b 3b 0a 20 20 69 66 28 20 70 54 79  O_UNK;.  if( pTy
5430: 70 65 2d 3e 6e 3d 3d 34 20 26 26 20 73 71 6c 69  pe->n==4 && sqli
5440: 74 65 53 74 72 4e 49 43 6d 70 28 70 54 79 70 65  teStrNICmp(pType
5450: 2d 3e 7a 2c 20 22 74 65 78 74 22 2c 20 34 29 3d  ->z, "text", 4)=
5460: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5470: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
5480: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 79 70 65  .  }.  if( pType
5490: 2d 3e 6e 3d 3d 37 20 26 26 20 73 71 6c 69 74 65  ->n==7 && sqlite
54a0: 53 74 72 4e 49 43 6d 70 28 70 54 79 70 65 2d 3e  StrNICmp(pType->
54b0: 7a 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 37 29  z, "numeric", 7)
54c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
54d0: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
54e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 53 65 74  .  }.  sqliteSet
54f0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
5500: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
5510: 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70  wn collating typ
5520: 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20 70 54  e: ", -1,.    pT
5530: 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e  ype->z, pType->n
5540: 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  , 0);.  pParse->
5550: 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nErr++;.  return
5560: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 4b 3b 0a   SQLITE_SO_UNK;.
5570: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5580: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5590: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
55a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
55b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
55c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
55d0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 43 4f  tatement.  A "CO
55e0: 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 68 61  LLATE" clause ha
55f0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
5600: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
5610: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5620: 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72  he Column.sortOr
5630: 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  der on.** the co
5640: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
5650: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5660: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5670: 65 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  eAddCollateType(
5680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
5690: 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b 0a 20 20  nt collType){.  
56a0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
56b0: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
56c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
56d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
56e0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
56f0: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
5700: 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  Col[i].sortOrder
5710: 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a   = collType;.}..
5720: 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69  /*.** Come up wi
5730: 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20  th a new random 
5740: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63  value for the sc
5750: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61  hema cookie.  Ma
5760: 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e  ke sure.** the n
5770: 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66  ew value is diff
5780: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
5790: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ld..**.** The sc
57a0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
57b0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
57c0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
57d0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
57e0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
57f0: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
5800: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
5810: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
5820: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
5830: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
5840: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
5850: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
5860: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
5870: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
5880: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
5890: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
58a0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
58b0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
58c0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
58d0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
58e0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
58f0: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
5900: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
5910: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
5920: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
5930: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
5940: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
5950: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
5960: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
5970: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
5980: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
5990: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
59a0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
59b0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
59c0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
59d0: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
59e0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
59f0: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
5a00: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
5a10: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
5a20: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
5a30: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
5a40: 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  e(sqlite *db){. 
5a50: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
5a60: 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61  okie==db->schema
5a70: 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64  _cookie ){.    d
5a80: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d  b->next_cookie =
5a90: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
5aa0: 69 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f  ie + sqliteRando
5ab0: 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20  mByte() + 1;.   
5ac0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
5ad0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
5ae0: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
5af0: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
5b00: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5b10: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
5b20: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
5b30: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
5b40: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
5b50: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
5b60: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
5b70: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
5b80: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
5b90: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
5ba0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
5bb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
5bc0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
5bd0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20  needQuote = 0;. 
5be0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
5bf0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
5c00: 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b   *z=='\'' ){ n++
5c10: 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d  ; needQuote=1; }
5c20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
5c30: 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d  + needQuote*2;.}
5c40: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
5c50: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
5c60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5c70: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
5c80: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
5c90: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
5ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5cb0: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
5cc0: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
5cd0: 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69  ar *zIdent){.  i
5ce0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
5cf0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
5d00: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
5d10: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
5d20: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
5d30: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
5d40: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
5d50: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
5d60: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
5d70: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
5d80: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
5da0: 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65  qliteKeywordCode
5db0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
5dc0: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
5dd0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
5de0: 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  \'';.  for(j=0; 
5df0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
5e00: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
5e10: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
5e20: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27   zIdent[j]=='\''
5e30: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
5e40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
5e50: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
5e60: 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20   '\'';.  z[i] = 
5e70: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
5e80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5e90: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
5ea0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
5eb0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
5ec0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
5ed0: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
5ee0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
5ef0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
5f00: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
5f10: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5f20: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5f30: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
5f40: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5f50: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
5f60: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29  leStmt(Table *p)
5f70: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
5f80: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
5f90: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
5fa0: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e  Sep2, *zEnd;.  n
5fb0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
5fc0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
5fd0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
5fe0: 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69  Length(p->aCol[i
5ff0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
6000: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
6010: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
6020: 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<40 ){.    zS
6030: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
6040: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
6050: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
6060: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
6070: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
6080: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
6090: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
60a0: 0a 20 20 6e 20 2b 3d 20 32 35 20 2b 20 36 2a 70  .  n += 25 + 6*p
60b0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
60c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
60d0: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
60e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
60f0: 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
6100: 54 65 6d 70 20 29 3b 0a 20 20 73 74 72 63 70 79  Temp );.  strcpy
6110: 28 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20  (zStmt, "CREATE 
6120: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
6130: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
6140: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
6150: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
6160: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
6170: 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  (';.  for(i=0; i
6180: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
6190: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
61a0: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
61b0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
61c0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
61d0: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
61e0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
61f0: 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  k, p->aCol[i].zN
6200: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  ame);.  }.  strc
6210: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
6220: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
6230: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
6240: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6250: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
6260: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
6270: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
6280: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6290: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
62a0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
62b0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
62c0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
62d0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
62e0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
62f0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
6300: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
6310: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
6320: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
6330: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
6340: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
6350: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
6360: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
6370: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73  ,.** unless this
6380: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
6390: 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61  table or initFla
63a0: 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74  g==1.  When init
63b0: 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d  Flag==1,.** it m
63c0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
63d0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
63e0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
63f0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
6400: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
6410: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
6420: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
6430: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
6440: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
6450: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
6460: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
6470: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6480: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
6490: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
64a0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
64b0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
64c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
64d0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
64e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
64f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
6500: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
6510: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
6520: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
6530: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
6540: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
6550: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
6560: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
6570: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
6580: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
6590: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
65a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
65b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
65c0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
65d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
65e0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
65f0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6600: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
6610: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
6620: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
6630: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
6640: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
6650: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
6660: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
6670: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
6680: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
6690: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
66a0: 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  rn;..  /* Add th
66b0: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
66c0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
66d0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
66e0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
66f0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6700: 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20  nameClash==0 || 
6710: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
6720: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ==1 );.  if( pPa
6730: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
6740: 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  && pParse->nameC
6750: 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54  lash==0 ){.    T
6760: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
6770: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
6780: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
6790: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
67a0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
67b0: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
67c0: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
67d0: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
67e0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
67f0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
6800: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
6810: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6820: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
6830: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
6840: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
6850: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
6860: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
6870: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
6880: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
6890: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
68a0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74  from a SELECT, t
68b0: 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68  hen construct th
68c0: 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63  e.  ** list of c
68d0: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74  olumns and the t
68e0: 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ext of the table
68f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  ..  */.  if( pSe
6900: 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c  lect ){.    Tabl
6910: 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  e *pSelTab = sql
6920: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
6930: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
6940: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
6950: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
6960: 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72  eturn;.    asser
6970: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
6980: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70  .    p->nCol = p
6990: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
69a0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
69b0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
69c0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
69d0: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
69e0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
69f0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
6a00: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a  , pSelTab);.  }.
6a10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
6a20: 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65  tFlag is 1 it me
6a30: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6a40: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
6a50: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
6a60: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
6a70: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
6a80: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
6a90: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
6aa0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
6ab0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
6ac0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6ad0: 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70  from the .  ** p
6ae0: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66  Parse->newTnum f
6af0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
6b00: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68   number should h
6b10: 61 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a  ave been put.  *
6b20: 2a 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  * there by the s
6b30: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
6b40: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
6b50: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
6b60: 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  g ){.    p->tnum
6b70: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
6b80: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
6b90: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
6ba0: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
6bb0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
6bc0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
6bd0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
6be0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
6bf0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
6c00: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
6c10: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
6c20: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
6c30: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
6c40: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
6c50: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
6c60: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
6c70: 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65  e, then just cre
6c80: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ate the table.  
6c90: 44 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65  Do not.  ** make
6ca0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c   an entry in SQL
6cb0: 49 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f  ITE_MASTER..  */
6cc0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
6cd0: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6ce0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
6cf0: 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  *v;..    v = sql
6d00: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
6d10: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
6d20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6d30: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
6d40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
6d50: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
6d60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6d70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
6d80: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
6d90: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  sTemp);.      sq
6da0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6db0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
6dc0: 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  &p->tnum, P3_POI
6dd0: 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NTER);.    }else
6de0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
6df0: 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
6e00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6e10: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6e20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
6e30: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
6e40: 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20  !p->isTemp ){.  
6e50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6e60: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
6e70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
6e80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6e90: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6ea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
6eb0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
6ec0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6ed0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
6ee0: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
6ef0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
6f00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6f10: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6f20: 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54  1, "view", P3_ST
6f30: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
6f40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6f50: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6f60: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
6f70: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6f80: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
6f90: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
6fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6fb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6fc0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
6fd0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6fe0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e  eP3(v, -1, p->zN
6ff0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
7000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7010: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
7020: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 4, 0);.      s
7030: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7040: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
7050: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
7060: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
7070: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
7080: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
7090: 20 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73         n = z ? s
70a0: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
70b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
70c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
70d0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  z, n);.        s
70e0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
70f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7100: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
7110: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  =0 );.        n 
7120: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
7130: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
7140: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20  FirstToken.z) + 
7150: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
7160: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7170: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69   -1, pParse->sFi
7180: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
7190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
71a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
71b0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
71c0: 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  5, 0);.      sql
71d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
71e0: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
71f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7200: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
7210: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7220: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
7230: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74  nteger, db->next
7240: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
7250: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7260: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
7270: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 0, 0);.     
7280: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7290: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
72a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
72b0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
72c0: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e      int op = p->
72d0: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
72e0: 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57  WrAux : OP_OpenW
72f0: 72 69 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  rite;.      sqli
7300: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
7310: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
7320: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
7330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
7340: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
7350: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
7360: 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   1, 0, 0, 0);.  
7370: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
7380: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
7390: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  pParse);.  }.}..
73a0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
73b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
73c0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
73d0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
73e0: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
73f0: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7400: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7410: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7420: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7430: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7440: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7450: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7460: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
7470: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
7480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
7490: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
74a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
74b0: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
74c0: 70 53 65 6c 65 63 74 20 20 20 20 2f 2a 20 41 20  pSelect    /* A 
74d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
74e0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
74f0: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
7500: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e  /.){.  Token sEn
7510: 64 3b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  d;.  Table *p;. 
7520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7530: 20 20 69 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b    int n, offset;
7540: 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54  ..  sqliteStartT
7550: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
7560: 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  gin, pName, 0);.
7570: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
7580: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
7590: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
75a0: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
75b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
75c0: 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 67 6e  rn;.  }.  /* Ign
75d0: 6f 72 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ore ORDER BY cla
75e0: 75 73 65 73 20 6f 6e 20 61 20 53 45 4c 45 43 54  uses on a SELECT
75f0: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
7600: 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
7610: 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73     sqliteExprLis
7620: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 2d  tDelete(pSelect-
7630: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7640: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
7650: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  y = 0;.  }.  p->
7660: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
7670: 74 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  t;.  if( !pParse
7680: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
7690: 20 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77    if( sqliteView
76a0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
76b0: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
76c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
76d0: 0a 20 20 7d 0a 20 20 73 45 6e 64 20 3d 20 70 50  .  }.  sEnd = pP
76e0: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
76f0: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
7700: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
7710: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
7720: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
7730: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
7740: 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45  ;.  n = ((int)sE
7750: 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65  nd.z) - (int)pBe
7760: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42  gin->z;.  z = pB
7770: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
7780: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
7790: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
77a0: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
77b0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
77c0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
77d0: 20 3d 20 31 3b 0a 20 20 7a 20 3d 20 70 2d 3e 70   = 1;.  z = p->p
77e0: 53 65 6c 65 63 74 2d 3e 7a 53 65 6c 65 63 74 20  Select->zSelect 
77f0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
7800: 7a 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 20 29  z, n);.  if( z )
7810: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
7820: 28 69 6e 74 29 7a 29 20 2d 20 28 69 6e 74 29 70  (int)z) - (int)p
7830: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 20 20 73 71  Begin->z;.    sq
7840: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
7850: 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74  rings(p->pSelect
7860: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  , offset);.    s
7870: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50  qliteEndTable(pP
7880: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
7890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
78a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ../*.** The Tabl
78b0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
78c0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
78d0: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
78e0: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
78f0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
7900: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
7910: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
7920: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7930: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
7940: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
7950: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
7960: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
7970: 50 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  Pare->zErrMsg..*
7980: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77  /.int sqliteView
7990: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
79a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
79b0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
79c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
79d0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
79e0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
79f0: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
7a00: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
7a10: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
7a20: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
7a30: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
7a40: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
7a50: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
7a60: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
7a70: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
7a80: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
7a90: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
7aa0: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
7ab0: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
7ac0: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
7ad0: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
7ae0: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
7af0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
7b00: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
7b10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
7b20: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
7b30: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
7b40: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
7b50: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
7b60: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
7b70: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
7b80: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
7b90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
7ba0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
7bb0: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
7bc0: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
7bd0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
7be0: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
7bf0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
7c00: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7c10: 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c  , "view ", pTabl
7c20: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
7c30: 20 20 20 22 20 69 73 20 63 69 72 63 75 6c 61 72     " is circular
7c40: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b  ly defined", 0);
7c50: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7c60: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
7c70: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
7c80: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
7c90: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
7ca0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
7cb0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
7cc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
7cd0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20  ble->pSelect ); 
7ce0: 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74  /* If nCol==0, t
7cf0: 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20  hen pTable must 
7d00: 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70  be a VIEW */.  p
7d10: 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53  Sel = pTable->pS
7d20: 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74  elect;..  /* Not
7d30: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
7d40: 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53  to sqliteResultS
7d50: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
7d60: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
7d70: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
7d80: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
7d90: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
7da0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
7db0: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
7dc0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
7dd0: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
7de0: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
7df0: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
7e00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
7e10: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
7e20: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
7e30: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
7e40: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
7e50: 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74  prListDup(pEList
7e60: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70  );.  if( pSel->p
7e70: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
7e80: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
7e90: 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72  EList;.    retur
7ea0: 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  n 1;  /* Malloc 
7eb0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
7ec0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
7ed0: 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73  1;.  pSelTab = s
7ee0: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
7ef0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
7f00: 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70  , pSel);.  if( p
7f10: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73  SelTab ){.    as
7f20: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
7f30: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ol==0 );.    pTa
7f40: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
7f50: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
7f60: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
7f70: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
7f80: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
7f90: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
7fa0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
7fb0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
7fc0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
7fd0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c    pParse->db->fl
7fe0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e  ags |= SQLITE_Un
7ff0: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65  resetViews;.  }e
8000: 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  lse{.    pTable-
8010: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e  >nCol = 0;.    n
8020: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  Err++;.  }.  sql
8030: 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  iteSelectUnbind(
8040: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45  pSel);.  sqliteE
8050: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
8060: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
8070: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
8080: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
8090: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
80a0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
80b0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
80c0: 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a  VIEW pTable..**.
80d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
80e0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
80f0: 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62  er any other tab
8100: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f  le or view is mo
8110: 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76  dified..** The v
8120: 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20  iew passed into 
8130: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
8140: 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74  ht depend direct
8150: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
8160: 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66  .** on the modif
8170: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74  ied or deleted t
8180: 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20  able so we need 
8190: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64  to clear the old
81a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73   column.** names
81b0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69   so that they wi
81c0: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
81d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
81e0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
81f0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
8200: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
8210: 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  t i;.  if( pTabl
8220: 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e  e==0 || pTable->
8230: 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74  pSelect==0 ) ret
8240: 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  urn;.  if( pTabl
8250: 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  e->nCol==0 ) ret
8260: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
8270: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
8280: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
8290: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
82a0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
82b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
82c0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
82d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
82e0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
82f0: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  i].zType);.  }. 
8300: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
8310: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61  le->aCol);.  pTa
8320: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
8330: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
8340: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
8350: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
8360: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
8370: 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  EW..*/.void sqli
8380: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
8390: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61  qlite *db){.  Ha
83a0: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
83b0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
83c0: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
83d0: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
83e0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
83f0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
8400: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
8410: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
8420: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8430: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
8440: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
8450: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
8460: 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65      sqliteViewRe
8470: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
8480: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
8490: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
84a0: 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69  SQLITE_UnresetVi
84b0: 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ews;.}../*.** Gi
84c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
84d0: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
84e0: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
84f0: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
8500: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
8510: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
8520: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
8530: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
8540: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
8550: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8560: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
8570: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
8580: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8590: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
85a0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
85b0: 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  en(pTok);.  if( 
85c0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
85d0: 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  n 0;.  pTab = sq
85e0: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
85f0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
8600: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
8610: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
8620: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
8630: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
8640: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8650: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
8660: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54  , 0, .        pT
8670: 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20  ok->z, pTok->n, 
8680: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
8690: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
86a0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
86b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
86c0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
86d0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
86e0: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
86f0: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
8700: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8710: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
8720: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
8730: 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61  liteDropTable(Pa
8740: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8750: 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  en *pName, int i
8760: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
8770: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
8780: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
8790: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
87a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
87b0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
87c0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
87d0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
87e0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
87f0: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
8800: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b  (pParse, pName);
8810: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
8820: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8830: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
8840: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
8850: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8860: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
8870: 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e ", pTable->zNa
8880: 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61  me, .       " ma
8890: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
88a0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
88b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
88c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
88d0: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c   isView && pTabl
88e0: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  e->pSelect==0 ){
88f0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8900: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8910: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
8920: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
8930: 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20   table ",.      
8940: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
8950: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8960: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
8970: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  n;.  }.  if( !is
8980: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
8990: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
89a0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
89b0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
89c0: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
89d0: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 22  to delete view "
89e0: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
89f0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
8a00: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
8a10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
8a20: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
8a30: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
8a40: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
8a50: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
8a60: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
8a70: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
8a80: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
8a90: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
8aa0: 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61  ic VdbeOp dropTa
8ab0: 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ble[] = {.      
8ac0: 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  { OP_OpenWrite, 
8ad0: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 4d 41   0, 2,        MA
8ae0: 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20  STER_NAME},.    
8af0: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
8b00: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20     0, ADDR(9),  
8b10: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
8b20: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
8b30: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32          0}, /* 2
8b40: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
8b50: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
8b60: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
8b70: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
8b80: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
8b90: 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20  0}, /* 4 */.    
8ba0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
8bb0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
8bc0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
8bd0: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
8be0: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
8bf0: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
8c00: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
8c10: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
8c20: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
8c30: 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a 20 38  DR(4),  0}, /* 8
8c40: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
8c50: 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20 30 2c  nteger,    0, 0,
8c60: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39          0}, /* 9
8c70: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
8c80: 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c  etCookie,  0, 0,
8c90: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
8ca0: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
8cb0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
8cc0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49  0},.    };.    I
8cd0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
8ce0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
8cf0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
8d00: 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 44 72 6f  , 0);.    /* Dro
8d10: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
8d20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8d30: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
8d40: 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 77 68  ropped */.    wh
8d50: 69 6c 65 28 20 70 54 61 62 6c 65 2d 3e 70 54 72  ile( pTable->pTr
8d60: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 54  igger ){.      T
8d70: 6f 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20 20 74  oken tt;.      t
8d80: 74 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  t.z = pTable->pT
8d90: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20  rigger->name;.  
8da0: 20 20 20 20 74 74 2e 6e 20 3d 20 73 74 72 6c 65      tt.n = strle
8db0: 6e 28 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  n(pTable->pTrigg
8dc0: 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  er->name);.     
8dd0: 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67   sqliteDropTrigg
8de0: 65 72 28 70 50 61 72 73 65 2c 20 26 74 74 2c 20  er(pParse, &tt, 
8df0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
8e00: 28 20 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  ( !pTable->isTem
8e10: 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73 65 20  p ){.      base 
8e20: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
8e30: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
8e40: 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64  ze(dropTable), d
8e50: 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ropTable);.     
8e60: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8e70: 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20 70  eP3(v, base+2, p
8e80: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
8e90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  ;.      sqliteCh
8ea0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
8eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8ec0: 43 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65  ChangeP1(v, base
8ed0: 2b 39 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  +9, db->next_coo
8ee0: 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kie);.    }.    
8ef0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
8f00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8f10: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
8f20: 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d  oy, pTable->tnum
8f30: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
8f40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
8f50: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
8f60: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8f70: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
8f80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8f90: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
8fa0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54  , pIdx->tnum, pT
8fb0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  able->isTemp);. 
8fc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8fd0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
8fe0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
8ff0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
9000: 20 74 68 65 20 74 61 62 6c 65 20 28 61 6e 64 20   the table (and 
9010: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 29  all its indices)
9020: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
9030: 44 52 4f 50 20 71 75 65 75 65 2e 0a 20 20 2a 2a  DROP queue..  **
9040: 20 4f 72 2c 20 69 66 20 74 68 65 20 74 61 62 6c   Or, if the tabl
9050: 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f 6d 6d  e was never comm
9060: 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65 6c 65  itted, just dele
9070: 74 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 74  te it.  If the t
9080: 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 62 65  able.  ** has be
9090: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 61 6e 64  en committed and
90a0: 20 69 73 20 70 6c 61 63 65 64 20 6f 6e 20 74 68   is placed on th
90b0: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71  e pending DROP q
90c0: 75 65 75 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  ueue, then the. 
90d0: 20 2a 2a 20 64 65 6c 65 74 65 20 77 69 6c 6c 20   ** delete will 
90e0: 6f 63 63 75 72 20 77 68 65 6e 20 73 71 6c 69 74  occur when sqlit
90f0: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
9100: 68 61 6e 67 65 73 28 29 20 65 78 65 63 75 74 65  hanges() execute
9110: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  s..  **.  ** Exc
9120: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
9130: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
9140: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
9150: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
9160: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
9170: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
9180: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
9190: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
91a0: 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69  .    sqlitePendi
91b0: 6e 67 44 72 6f 70 54 61 62 6c 65 28 64 62 2c 20  ngDropTable(db, 
91c0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d  pTable);.    db-
91d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
91e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
91f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
9200: 52 65 73 65 74 41 6c 6c 28 64 62 29 3b 0a 7d 0a  ResetAll(db);.}.
9210: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
9220: 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
9230: 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e   SQL table.  pIn
9240: 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20  dex is the name 
9250: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
9260: 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74   and pTable is t
9270: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
9280: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
9290: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
92a0: 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
92b0: 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
92c0: 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
92d0: 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
92e0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
92f0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
9300: 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
9310: 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
9320: 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
9330: 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
9340: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
9350: 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
9360: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
9370: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
9380: 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
9390: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
93a0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
93b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
93c0: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
93d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
93e0: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
93f0: 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
9400: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
9410: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
9420: 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
9430: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
9440: 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
9450: 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
9460: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9470: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
9480: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72  */.void sqliteCr
9490: 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
94a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
94b0: 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
94c0: 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
94d0: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
94e0: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
94f0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
9500: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
9510: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
9520: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
9530: 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  table to index. 
9540: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
9550: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
9560: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
9570: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
9580: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
9590: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
95a0: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
95b0: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
95c0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
95d0: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
95e0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
95f0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
9600: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
9610: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9620: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
9630: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
9640: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
9650: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
9660: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
9670: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
9680: 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
9690: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
96a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
96b0: 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  dex;   /* The in
96c0: 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
96d0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
96e0: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
96f0: 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
9700: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
9710: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
9720: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
9730: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  st */.  sqlite *
9740: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9750: 0a 20 20 69 6e 74 20 68 69 64 65 4e 61 6d 65 20  .  int hideName 
9760: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
9770: 44 6f 20 6e 6f 74 20 70 75 74 20 74 61 62 6c 65  Do not put table
9780: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73   name in the has
9790: 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  h table */..  if
97a0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
97b0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
97c0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
97d0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
97e0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
97f0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9800: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
9810: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
9820: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
9830: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  */.  if( pTable!
9840: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
9850: 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( pName!=0 );.  
9860: 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65    pTab =  sqlite
9870: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
9880: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
9890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
98a0: 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
98b0: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
98c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
98d0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
98e0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
98f0: 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
9900: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
9910: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
9920: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
9930: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
9940: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
9950: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
9960: 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f   .      " may no
9970: 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63  t have new indic
9980: 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20  es added", 0);. 
9990: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
99a0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
99b0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
99c0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
99d0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
99e0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
99f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9a00: 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
9a10: 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a  e indexed", 0);.
9a20: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9a30: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
9a40: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9a50: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
9a60: 73 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  s index is creat
9a70: 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64  ed while re-read
9a80: 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61 20 66  ing the schema f
9a90: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
9aa0: 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74  r.  ** but the t
9ab0: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
9ac0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
9ad0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
9ae0: 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a  able, it can.  *
9af0: 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74  * only mean that
9b00: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9b10: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 72 65  this index is re
9b20: 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20  ally associated 
9b30: 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  with is.  ** one
9b40: 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68   whose name is h
9b50: 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74  idden behind a t
9b60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77  emporary table w
9b70: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
9b80: 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74  e..  ** Since it
9b90: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
9ba0: 20 73 75 70 70 72 65 73 73 65 64 2c 20 77 65 20   suppressed, we 
9bb0: 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70  need to also sup
9bc0: 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69  press the.  ** i
9bd0: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
9be0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
9bf0: 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54 65 6d  g && pTab->isTem
9c00: 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  p ){.    goto ex
9c10: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9c20: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9c30: 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
9c40: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
9c50: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9c60: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
9c70: 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
9c80: 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
9c90: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
9ca0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
9cb0: 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
9cc0: 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
9cd0: 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
9ce0: 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
9cf0: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
9d00: 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
9d10: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9d20: 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
9d30: 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
9d40: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
9d50: 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
9d60: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
9d70: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
9d80: 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
9d90: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
9da0: 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
9db0: 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c 20 62  ss this index, b
9dc0: 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a 20  ut we will not. 
9dd0: 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20 6e 61   ** store its na
9de0: 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  me in the hash t
9df0: 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65 20 68  able.  Set the h
9e00: 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f 20  ideName flag to 
9e10: 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a 20  accomplish.  ** 
9e20: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
9e30: 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
9e40: 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
9e50: 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
9e60: 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
9e70: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
9e80: 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
9e90: 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
9ea0: 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
9eb0: 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
9ec0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61  .    Index *pISa
9ed0: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
9ee0: 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
9ef0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
9f00: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53  /.    Table *pTS
9f10: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
9f20: 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
9f30: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
9f40: 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20  ex */.    zName 
9f50: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
9f60: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
9f70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
9f80: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9f90: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9fa0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
9fb0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
9fc0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  dex(db, zName))!
9fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9fe0: 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61 62  pISameName->pTab
9ff0: 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50  le->isTemp && pP
a000: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
a010: 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61  {.        hideNa
a020: 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  me = 1;.      }e
a030: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
a040: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
a050: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
a060: 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20  index ", zName, 
a070: 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  .           " al
a080: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
a090: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
a0a0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
a0b0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
a0c0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
a0d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a0e0: 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
a0f0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
a100: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b  b, zName))!=0 ){
a110: 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 61 6d  .      if( pTSam
a120: 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26 26  eName->isTemp &&
a130: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
a140: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64  g ){.        hid
a150: 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20  eName = 1;.     
a160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a170: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
a180: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
a190: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
a1a0: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
a1b0: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
a1c0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
a1d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
a1e0: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
a1f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
a200: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
a210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
a220: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
a230: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
a240: 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
a250: 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
a260: 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
a270: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
a280: 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
a290: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
a2a0: 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  d)",n);.    zNam
a2b0: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
a2c0: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
a2d0: 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e  e, "(", pTab->zN
a2e0: 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78  ame, " autoindex
a2f0: 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20   ", zBuf, 0);.  
a300: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
a310: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
a320: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68 69 64  e_index;.    hid
a330: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
a340: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
a350: 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e)!=0;.  }..  /*
a360: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
a370: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
a380: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
a390: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
a3a0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
a3b0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
a3c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
a3d0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
a3e0: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
a3f0: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
a400: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
a410: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
a420: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a430: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
a440: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
a450: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
a460: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
a470: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
a480: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
a490: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
a4a0: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
a4b0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
a4c0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
a4d0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
a4e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
a4f0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
a500: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
a510: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
a520: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
a530: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
a540: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
a550: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
a560: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
a570: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
a580: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
a590: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a5a0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
a5b0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
a5c0: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
a5d0: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
a5e0: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
a5f0: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
a600: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
a610: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
a620: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
a630: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
a640: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
a650: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
a660: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
a670: 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f  ex->isUnique = o
a680: 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 63  nError;..  /* Sc
a690: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
a6a0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
a6b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
a6c0: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
a6d0: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
a6e0: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
a6f0: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
a700: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
a710: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
a720: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
a730: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
a740: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
a750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
a760: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
a770: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
a780: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
a790: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
a7a0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
a7b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
a7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
a7d0: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
a7e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a7f0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
a800: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
a810: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
a820: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68 61  e, .        " ha
a830: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
a840: 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  d ", pList->a[i]
a850: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
a860: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a870: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
a880: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
a890: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
a8a0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
a8b0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
a8c0: 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d  lumn[i] = j;.  }
a8d0: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
a8e0: 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
a8f0: 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
a900: 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
a910: 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
a920: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
a930: 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
a940: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
a950: 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65 20  in && !hideName 
a960: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
a970: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
a980: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69  ashInsert(&db->i
a990: 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e  dxHash, pIndex->
a9a0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
a9b0: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
a9c0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a9d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
a9e0: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
a9f0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
aa00: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
aa10: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
aa20: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
aa30: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
aa40: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
aa50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
aa60: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
aa70: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
aa80: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
aa90: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
aaa0: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
aab0: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
aac0: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
aad0: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
aae0: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
aaf0: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
ab00: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
ab10: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
ab20: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
ab30: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
ab40: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
ab50: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
ab60: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
ab70: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
ab80: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
ab90: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
aba0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
abb0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
abc0: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
abd0: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
abe0: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
abf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
ac00: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
ac10: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
ac20: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
ac30: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
ac40: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
ac50: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
ac60: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
ac70: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
ac80: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
ac90: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
aca0: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
acb0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
acc0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
acd0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
ace0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
acf0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
ad00: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
ad10: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
ad20: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
ad30: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
ad40: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
ad50: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
ad60: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
ad70: 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  r from the pPars
ad80: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
ad90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
ada0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
adb0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
adc0: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
add0: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
ade0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
adf0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
ae00: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
ae10: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
ae20: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
ae30: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
ae40: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
ae50: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
ae60: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
ae70: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
ae80: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
ae90: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
aea0: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
aeb0: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
aec0: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
aed0: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
aee0: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
aef0: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
af00: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
af10: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
af20: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
af30: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
af40: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
af50: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
af60: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
af70: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
af80: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
af90: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
afa0: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
afb0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
afc0: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
afd0: 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d  .  ** If pTable=
afe0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
aff0: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
b000: 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
b010: 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
b020: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
b030: 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
b040: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
b050: 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
b060: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
b070: 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
b080: 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
b090: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
b0a0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
b0b0: 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
b0c0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
b0d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
b0e0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
b0f0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
b100: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
b110: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
b120: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
b130: 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d      int isTemp =
b140: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a   pTab->isTemp;..
b150: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
b160: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
b170: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
b180: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b190: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
b1a0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
b1b0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
b1c0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
b1d0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
b1e0: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
b1f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b200: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
b210: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
b220: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
b230: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41  angeP3(v, -1, MA
b240: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
b250: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
b260: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
b270: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
b280: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b290: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
b2a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b2b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b2c0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
b2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b2e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b2f0: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
b300: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
b310: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b320: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
b330: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b340: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b350: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50  pIndex->zName, P
b360: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
b370: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b380: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
b390: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b3a0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b3b0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
b3c0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
b3d0: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
b3e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b3f0: 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
b400: 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  x, 0, isTemp);. 
b410: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b420: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
b430: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74  char*)&pIndex->t
b440: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
b450: 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  ;.    pIndex->tn
b460: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
b470: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
b480: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
b490: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b4a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b4b0: 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20  WrAux, 1, 0);.  
b4c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b4e0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
b4f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
b500: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b510: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
b520: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b530: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65   }.    if( !isTe
b540: 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  mp ){.      addr
b550: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
b560: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
b570: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
b580: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
b590: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
b5a0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
b5b0: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
b5c0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 1;.        sql
b5d0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b5e0: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
b5f0: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  >z, n);.      }.
b600: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b610: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
b620: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
b630: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b640: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
b650: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
b660: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c   }.    if( pTabl
b670: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
b680: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73  eVdbeAddOp(v, is
b690: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75  Temp ? OP_OpenAu
b6a0: 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20  x : OP_Open, 2, 
b6b0: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
b6c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b6d0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
b6e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
b6f0: 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  TIC);.      lbl2
b700: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
b710: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
b720: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b730: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
b740: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
b750: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
b760: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
b770: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
b780: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
b790: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
b7a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b7b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b7c0: 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65  Column, 2, pInde
b7d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  x->aiColumn[i]);
b7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b7f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b800: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
b810: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
b820: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b830: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b840: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
b850: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
b860: 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  _None);.      sq
b870: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b880: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
b890: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b8a0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b8b0: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
b8c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b8d0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
b8e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b8f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b900: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
b910: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
b920: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
b930: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
b940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61         sqliteCha
b950: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20  ngeCookie(db);. 
b960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b970: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b980: 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63  eger, db->next_c
b990: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
b9a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b9b0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
b9c0: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 0, 0);.     
b9d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b9e0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b9f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
ba00: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
ba10: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ba20: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
ba30: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
ba40: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
ba50: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
ba60: 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  ex:.  sqliteIdLi
ba70: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
ba80: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
ba90: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
baa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bab0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
bac0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
bad0: 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
bae0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
baf0: 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
bb00: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
bb10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
bb20: 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
bb30: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
bb40: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
bb50: 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  ndex;.  char *zN
bb60: 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ame;.  Vdbe *v;.
bb70: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
bb80: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
bb90: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
bba0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
bbb0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
bbc0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
bbd0: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
bbe0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
bbf0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
bc00: 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  urn;.  pIndex = 
bc10: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
bc20: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
bc30: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
bc40: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
bc50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
bc60: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
bc70: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
bc80: 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c  uch index: ", 0,
bc90: 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d   .        pName-
bca0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
bcb0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
bcc0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
bcd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
bce0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
bcf0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
bd00: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
bd10: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
bd20: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
bd30: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
bd40: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
bd50: 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d  beOp dropIndex[]
bd60: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
bd70: 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32  OpenWrite,  0, 2
bd80: 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e  ,       MASTER_N
bd90: 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  AME},.      { OP
bda0: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
bdb0: 41 44 44 52 28 31 30 29 2c 30 7d 2c 20 0a 20 20  ADDR(10),0}, .  
bdc0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
bdd0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
bde0: 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20   0}, /* 2 */.   
bdf0: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
be00: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
be10: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
be20: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
be30: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 20         0}, /* 4 
be40: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
be50: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
be60: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
be70: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
be80: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
be90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
bea0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
beb0: 34 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  4), 0},.      { 
bec0: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
bed0: 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c 0a 20  , ADDR(10),0},. 
bee0: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
bef0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
bf00: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
bf10: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
bf20: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
bf30: 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20   0}, /* 10 */.  
bf40: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
bf50: 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ie,  0, 0,      
bf60: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
bf70: 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30  Close,      0, 0
bf80: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
bf90: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
bfa0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
bfb0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
bfc0: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65  e;..    sqliteBe
bfd0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
bfe0: 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  n(pParse, 0);.  
bff0: 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73 54    if( !pTab->isT
c000: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73  emp ){.      bas
c010: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
c020: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
c030: 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c  Size(dropIndex),
c040: 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20   dropIndex);.   
c050: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c060: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c  ngeP3(v, base+2,
c070: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
c080: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
c090: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
c0a0: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20  okie(db);.      
c0b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
c0c0: 50 31 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64  P1(v, base+10, d
c0d0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b  b->next_cookie);
c0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c0f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c100: 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78  _Destroy, pIndex
c110: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73  ->tnum, pTab->is
c120: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
c130: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
c140: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
c150: 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 69  .  /* Move the i
c160: 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65 20 70 65  ndex onto the pe
c170: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
c180: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e  .  Or, if the in
c190: 64 65 78 20 77 61 73 0a 20 20 2a 2a 20 6e 65 76  dex was.  ** nev
c1a0: 65 72 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75  er committed, ju
c1b0: 73 74 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49  st delete it.  I
c1c0: 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 70 65  ndices on the pe
c1d0: 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65  nding DROP queue
c1e0: 0a 20 20 2a 2a 20 67 65 74 20 64 65 6c 65 74 65  .  ** get delete
c1f0: 64 20 62 79 20 73 71 6c 69 74 65 43 6f 6d 6d 69  d by sqliteCommi
c200: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
c210: 28 29 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  () when the user
c220: 20 65 78 65 63 75 74 65 73 0a 20 20 2a 2a 20 61   executes.  ** a
c230: 20 43 4f 4d 4d 49 54 2e 20 20 4f 72 20 69 66 20   COMMIT.  Or if 
c240: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
c250: 73 2c 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  s, the elements 
c260: 6f 66 20 74 68 65 20 44 52 4f 50 20 71 75 65 75  of the DROP queu
c270: 65 0a 20 20 2a 2a 20 61 72 65 20 6d 6f 76 65 64  e.  ** are moved
c280: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d   back into the m
c290: 61 69 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  ain hash table..
c2a0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
c2b0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
c2c0: 20 20 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67     sqlitePending
c2d0: 44 72 6f 70 49 6e 64 65 78 28 64 62 2c 20 70 49  DropIndex(db, pI
c2e0: 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ndex);.    db->f
c2f0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
c300: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
c310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  }.}../*.** Appen
c320: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
c330: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
c340: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
c350: 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
c360: 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
c370: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
c380: 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
c390: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
c3a0: 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
c3b0: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
c3c0: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
c3d0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
c3e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c3f0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c400: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
c410: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
c420: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
c430: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
c440: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49    if( (pList->nI
c450: 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  d & 7)==0 ){.   
c460: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
c470: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20  tem *a;.    a = 
c480: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
c490: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
c4a0: 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c  nId+8)*sizeof(pL
c4b0: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
c4c0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
c4d0: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
c4e0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c4f0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c500: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
c510: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
c520: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
c530: 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
c540: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c550: 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  ));.  if( pToken
c560: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
c570: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
c580: 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b  ist->nId].zName;
c590: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
c5a0: 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e  tring(pz, pToken
c5b0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
c5c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
c5d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c5e0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
c5f0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
c600: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
c610: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
c620: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
c630: 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e  }.  }.  pList->n
c640: 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
c650: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
c660: 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
c670: 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
c680: 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
c690: 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
c6a0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
c6b0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
c6c0: 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
c6d0: 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
c6e0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
c6f0: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
c700: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
c710: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
c720: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
c730: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53  SrcList *sqliteS
c740: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
c750: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
c760: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
c770: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
c780: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
c790: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c7a0: 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
c7b0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
c7c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c7d0: 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 20 26  ( (pList->nSrc &
c7e0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   7)==0 ){.    st
c7f0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
c800: 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71  m *a;.    a = sq
c810: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
c820: 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 53  t->a, (pList->nS
c830: 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69  rc+8)*sizeof(pLi
c840: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
c850: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c860: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
c870: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c880: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c890: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
c8a0: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
c8b0: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
c8c0: 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
c8d0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c8e0: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
c8f0: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
c900: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
c910: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d  List->nSrc].zNam
c920: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
c930: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
c940: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
c950: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
c960: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
c970: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
c980: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
c990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
c9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c9b0: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
c9c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
c9d0: 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
c9e0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
c9f0: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
ca00: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
ca10: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
ca20: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
ca30: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
ca40: 69 74 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69  iteSrcListAddAli
ca50: 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
ca60: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
ca70: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
ca80: 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
ca90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
caa0: 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a  List->nSrc - 1;.
cab0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
cac0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
cad0: 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e  ].zAlias, pToken
cae0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
caf0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
cb00: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
cb10: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d  ].zAlias);.  }.}
cb20: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
cb30: 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
cb40: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65  d sqliteIdListDe
cb50: 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
cb60: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
cb70: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
cb80: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
cb90: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
cba0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
cbb0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
cbc0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
cbd0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
cbe0: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
cbf0: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
cc00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
cc10: 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
cc20: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
cc30: 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
cc40: 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
cc50: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
cc60: 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49  iteIdListIndex(I
cc70: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
cc80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
cc90: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
cca0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
ccb0: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
ccc0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
ccd0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
cce0: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
ccf0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
cd00: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
cd10: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
cd20: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
cd30: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
cd40: 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
cd50: 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
cd60: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
cd70: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
cd80: 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
cd90: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
cda0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
cdb0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
cdc0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
cdd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
cde0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
cdf0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
ce00: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
ce10: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
ce20: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
ce30: 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
ce40: 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
ce50: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
ce60: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
ce70: 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  le(0, pList->a[i
ce80: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
ce90: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
cea0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
ceb0: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
cec0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
ced0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e  (pList->a[i].pOn
cee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c  );.    sqliteIdL
cef0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
cf00: 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
cf10: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
cf20: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
cf30: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
cf40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50  }../*.** The COP
cf50: 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72  Y command is for
cf60: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
cf70: 69 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61  ith PostgreSQL a
cf80: 6e 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79  nd specificially
cf90: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c  .** for the abil
cfa0: 69 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20  ity to read the 
cfb0: 6f 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d  output of pg_dum
cfc0: 70 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69  p.  The format i
cfd0: 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a  s as.** follows:
cfe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74  .**.**    COPY t
cff0: 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b  able FROM file [
d000: 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53  USING DELIMITERS
d010: 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22   string].**.** "
d020: 74 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69  table" is an exi
d030: 73 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  sting table name
d040: 2e 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20  .  We will read 
d050: 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72  lines of code fr
d060: 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69  om.** file to fi
d070: 6c 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69  ll this table wi
d080: 74 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d  th data.  File m
d090: 69 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e  ight be "stdin".
d0a0: 20 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a    The optional.*
d0b0: 2a 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69  * delimiter stri
d0c0: 6e 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  ng identifies th
d0d0: 65 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f  e field separato
d0e0: 72 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  rs.  The default
d0f0: 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f   is a tab..*/.vo
d100: 69 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20  id sqliteCopy(. 
d110: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d120: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
d130: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
d140: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
d150: 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  me,   /* The nam
d160: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  e of the table i
d170: 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c  nto which we wil
d180: 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f  l insert */.  To
d190: 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20  ken *pFilename, 
d1a0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
d1b0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74  rom which to obt
d1c0: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ain information 
d1d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c  */.  Token *pDel
d1e0: 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65  imiter,   /* Use
d1f0: 20 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65   this as the fie
d200: 6c 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a  ld delimiter */.
d210: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20    int onError   
d220: 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
d230: 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72  o do if a constr
d240: 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b  aint fails */.){
d250: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
d260: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20    char *zTab;.  
d270: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76  int i;.  Vdbe *v
d280: 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e  ;.  int addr, en
d290: 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  d;.  Index *pIdx
d2a0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
d2b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
d2c0: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62  zTab = sqliteTab
d2d0: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
d2e0: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69  pTableName);.  i
d2f0: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
d300: 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d  _failed || zTab=
d310: 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63  =0 ) goto copy_c
d320: 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d  leanup;.  pTab =
d330: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
d340: 54 6f 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ToTable(pParse, 
d350: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  zTab);.  sqliteF
d360: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28  ree(zTab);.  if(
d370: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
d380: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
d390: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
d3a0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
d3b0: 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70   v ){.    int op
d3c0: 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  enOp;.    sqlite
d3d0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d3e0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  ion(pParse, 1);.
d3f0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d410: 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29  _FileOpen, 0, 0)
d420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d430: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
d440: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20  , pFilename->z, 
d450: 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20  pFilename->n);. 
d460: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
d470: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
d480: 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54  .    openOp = pT
d490: 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f  ab->isTemp ? OP_
d4a0: 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f  OpenWrAux : OP_O
d4b0: 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71  penWrite;.    sq
d4c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d4d0: 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62   openOp, 0, pTab
d4e0: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
d4f0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d500: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
d510: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
d520: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
d530: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d540: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d550: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
d560: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d570: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69  dOp(v, openOp, i
d580: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
d590: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
d5a0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
d5b0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
d5c0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
d5d0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
d5e0: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
d5f0: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
d600: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d610: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
d620: 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
d630: 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a   the row count *
d640: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20  /.    }.    end 
d650: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
d660: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64  Label(v);.    ad
d670: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
d680: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52  ddOp(v, OP_FileR
d690: 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ead, pTab->nCol,
d6a0: 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70   end);.    if( p
d6b0: 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20  Delimiter ){.   
d6c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d6d0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
d6e0: 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44  Delimiter->z, pD
d6f0: 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20  elimiter->n);.  
d700: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
d710: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
d720: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d740: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22  ngeP3(v, addr, "
d750: 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  \t", 1);.    }. 
d760: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b     if( pTab->iPK
d770: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ey>=0 ){.      s
d780: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d790: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
d7a0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29   pTab->iPKey, 0)
d7b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d7c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
d7d0: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
d7e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d7f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d800: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
d810: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
d820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
d830: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
d840: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
d850: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
d860: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
d870: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  r primary key co
d880: 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77  lumn is filled w
d890: 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69  ith NULL since i
d8a0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  ts.        ** va
d8b0: 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75  lue is always pu
d8c0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  lled from the re
d8d0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  cord number */. 
d8e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
d8f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
d900: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
d910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d920: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d930: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
d940: 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, i, 0);.      
d950: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d960: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
d970: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
d980: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30  e, pTab, 0, 0, 0
d990: 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64  , 0, onError, ad
d9a0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  dr);.    sqliteC
d9b0: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
d9c0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
d9d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
d9e0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
d9f0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
da00: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)!=0 ){.      s
da10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
da20: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
da30: 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  0);  /* Incremen
da40: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
da50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
da60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
da70: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
da80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
da90: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
daa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
dab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
dac0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
dad0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
dae0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
daf0: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
db00: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
db10: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
db20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
db30: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
db40: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
db50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
db60: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30  OP_ColumnName, 0
db70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
db80: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
db90: 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65  , -1, "rows inse
dba0: 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43  rted", P3_STATIC
dbb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
dbc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
dbd0: 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a  allback, 1, 0);.
dbe0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70      }.  }.  .cop
dbf0: 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74  y_cleanup:.  ret
dc00: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
dc10: 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56  e non-standard V
dc20: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73  ACUUM command is
dc30: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
dc40: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  p the database,.
dc50: 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65  ** collapse free
dc60: 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74   space, etc.  It
dc70: 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74   is modelled aft
dc80: 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f  er the VACUUM co
dc90: 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74  mmand.** in Post
dca0: 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e  greSQL..**.** In
dcb0: 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20 6f   version 1.0.x o
dcc0: 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56 41  f SQLite, the VA
dcd0: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f 75  CUUM command wou
dce0: 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f  ld call.** gdbm_
dcf0: 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e 20  reorganize() on 
dd00: 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  all the database
dd10: 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62 65   tables.  But be
dd20: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
dd30: 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e 6f  2.0.0, SQLite no
dd40: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44 42   longer uses GDB
dd50: 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e  M so this comman
dd60: 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65 20  d has.** become 
dd70: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64  a no-op..*/.void
dd80: 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61   sqliteVacuum(Pa
dd90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
dda0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b  en *pTableName){
ddb0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
ddc0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   */.}../*.** Beg
ddd0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
dde0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
ddf0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
de00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
de10: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
de20: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
de30: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
de40: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
de50: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
de60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
de70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
de80: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
de90: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
dea0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
deb0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
dec0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
ded0: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
dee0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29  ation(pParse, 0)
def0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
df00: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b   SQLITE_InTrans;
df10: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
df20: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
df30: 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
df40: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
df50: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e  sqliteCommitTran
df60: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
df70: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
df80: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
df90: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
dfa0: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
dfb0: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
dfc0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
dfd0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
dfe0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
dff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
e000: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
e010: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
e020: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e  ) return;.  db->
e030: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
e040: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69  _InTrans;.  sqli
e050: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
e060: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64  ion(pParse);.  d
e070: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
e080: 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
e090: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
e0a0: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
e0b0: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54   sqliteRollbackT
e0c0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
e0d0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
e0e0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
e0f0: 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
e100: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
e110: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
e120: 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72  ->pBe==0 ) retur
e130: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
e140: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
e150: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
e160: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
e170: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
e180: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20  E_InTrans)==0 ) 
e190: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
e1a0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
e1b0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
e1c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e1d0: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
e1e0: 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
e1f0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
e200: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
e210: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
e220: 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
e230: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
e240: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
e250: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
e260: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
e270: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
e280: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
e290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e2a0: 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
e2b0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
e2c0: 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
e2d0: 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
e2e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
e2f0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
e300: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
e310: 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
e320: 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
e330: 66 20 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f  f the setCheckpo
e340: 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  int parameter is
e350: 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
e360: 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
e370: 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
e380: 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
e390: 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
e3a0: 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
e3b0: 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
e3c0: 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
e3d0: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
e3e0: 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
e3f0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
e400: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
e410: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
e420: 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
e430: 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
e440: 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
e450: 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
e460: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
e470: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
e480: 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
e490: 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
e4a0: 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
e4b0: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
e4c0: 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
e4d0: 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
e4e0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
e4f0: 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
e500: 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43  pParse, int setC
e510: 68 65 63 6b 70 6f 69 6e 74 29 7b 0a 20 20 56 64  heckpoint){.  Vd
e520: 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
e530: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
e540: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
e550: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e560: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
e570: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
e580: 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
e590: 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  igger */.  if( (
e5a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
e5b0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
e5c0: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ns)==0 ){.    sq
e5d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e5e0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
e5f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
e600: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e610: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
e620: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65  pParse->db->sche
e630: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  ma_cookie, 0);. 
e640: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
e650: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
e660: 20 7d 65 6c 73 65 20 69 66 28 20 73 65 74 43 68   }else if( setCh
e670: 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  eckpoint ){.    
e680: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e690: 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
e6a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
e6b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e6c0: 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64  ode that conclud
e6d0: 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  es an operation 
e6e0: 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63 68  that may have ch
e6f0: 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74  anged.** the dat
e700: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
e710: 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63  a companion func
e720: 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72 69  tion to BeginWri
e730: 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a 2a  teOperation()..*
e740: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
e750: 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
e760: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e 20  then commit it. 
e770: 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74   If a checkpoint
e780: 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64 20   was.** started 
e790: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61 74  then commit that
e7a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e7b0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
e7c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
e7d0: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
e7e0: 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  f( pParse->trigS
e7f0: 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f  tack ) return; /
e800: 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20  * if this is in 
e810: 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76  a trigger */.  v
e820: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
e830: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e840: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e850: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
e860: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
e870: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f  InTrans ){.    /
e880: 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do Nothing */.
e890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
e8a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e8b0: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  OP_Commit, 0, 0)
e8c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
e8d0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
e8e0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
e8f0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
e900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
e910: 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29  Boolean(char *z)
e920: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
e930: 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79  *azTrue[] = { "y
e940: 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65  es", "on", "true
e950: 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
e960: 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
e970: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
e980: 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
e990: 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
e9a0: 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
e9b0: 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
e9c0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
e9d0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75  ; i<sizeof(azTru
e9e0: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65  e)/sizeof(azTrue
e9f0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
ea00: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ea10: 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d  p(z,azTrue[i])==
ea20: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
ea30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ea40: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
ea50: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
ea60: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d  t.  .**.** Pragm
ea70: 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66  as are of this f
ea80: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
ea90: 50 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75  PRAGMA id = valu
eaa0: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e  e.**.** The iden
eab0: 74 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73  tifier might als
eac0: 6f 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20  o be a string.  
ead0: 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  The value is a s
eae0: 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64  tring, and.** id
eaf0: 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e  entifier, or a n
eb00: 75 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73  umber.  If minus
eb10: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
eb20: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a  en the value is.
eb30: 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74  ** a number that
eb40: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
eb50: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
eb60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61  /.void sqlitePra
eb70: 67 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  gma(Parse *pPars
eb80: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c  e, Token *pLeft,
eb90: 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20   Token *pRight, 
eba0: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
ebb0: 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20    char *zLeft = 
ebc0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  0;.  char *zRigh
ebd0: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20  t = 0;.  sqlite 
ebe0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ebf0: 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c  ;..  zLeft = sql
ec00: 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74  iteStrNDup(pLeft
ec10: 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a  ->z, pLeft->n);.
ec20: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
ec30: 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69  zLeft);.  if( mi
ec40: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a  nusFlag ){.    z
ec50: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73  Right = 0;.    s
ec60: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
ec70: 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c  &zRight, "-", 1,
ec80: 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67   pRight->z, pRig
ec90: 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  ht->n, 0);.  }el
eca0: 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d  se{.    zRight =
ecb0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
ecc0: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
ecd0: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
ece0: 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b  Dequote(zRight);
ecf0: 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a  .  }. .  /*.  **
ed00: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
ed10: 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  _cache_size.  **
ed20: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
ed30: 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20  _cache_size=N.  
ed40: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
ed50: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
ed60: 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69  he current persi
ed70: 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  stent setting fo
ed80: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
ed90: 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65  cache size.  The
eda0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
edb0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
edc0: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
edd0: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
ede0: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
edf0: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74  nd form sets bot
ee00: 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  h the current.  
ee10: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
ee20: 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  ze value and the
ee30: 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65   persistent page
ee40: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
ee50: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
ee60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ee70: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
ee80: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
ee90: 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69  size is stored i
eea0: 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f  n meta-value 2 o
eeb0: 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a  f page 1 of the.
eec0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
eed0: 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65 20 73  le.  The cache s
eee0: 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ize is actually 
eef0: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
ef00: 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  ue of.  ** this 
ef10: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
ef20: 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65    The sign of me
ef30: 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72  ta-value 2 deter
ef40: 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  mines the.  ** s
ef50: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
ef60: 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  ng.  A negative 
ef70: 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63  value means sync
ef80: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20  hronous is off. 
ef90: 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69   ** and a positi
efa0: 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73  ve value means s
efb0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
efc0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
efd0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
efe0: 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  ,"default_cache_
eff0: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
f000: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
f010: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
f020: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  {.      { OP_Rea
f030: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
f040: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
f050: 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20   { OP_AbsValue, 
f060: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
f070: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
f080: 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  up,         0, 0
f090: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f0a0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
f0b0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
f0c0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
f0d0: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Ne,          0,
f0e0: 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   6,        0},. 
f0f0: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
f100: 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53  r,     MAX_PAGES
f110: 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ,0, 0},.      { 
f120: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
f130: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
f140: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
f150: 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
f160: 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a        "cache_siz
f170: 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e"},.      { OP_
f180: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
f190: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
f1a0: 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
f1b0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f1c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
f1d0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
f1e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
f1f0: 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
f200: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f210: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f220: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
f230: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
f240: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
f250: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
f260: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
f270: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
f280: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
f290: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
f2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
f2b0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f2c0: 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
f2d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f2e0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
f2f0: 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20   size, 0);.     
f300: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f310: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
f320: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
f330: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
f340: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f350: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
f360: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f370: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
f380: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
f390: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f3a0: 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30  , OP_Negative, 0
f3b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f3c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f3d0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
f3e0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f3f0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
f400: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  n(pParse);.     
f410: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
f420: 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
f430: 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a  <0 ? -size : siz
f440: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
f450: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
f460: 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61  (db->pBe, db->ca
f470: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
f480: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20  .  }else..  /*. 
f490: 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68   **  PRAGMA cach
f4a0: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
f4b0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 4e  GMA cache_size=N
f4c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
f4d0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
f4e0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
f4f0: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
f500: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
f510: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 6c  che size.  The l
f520: 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 63 61 6e  ocal setting can
f530: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72   be different fr
f540: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 73  om.  ** the pers
f550: 69 73 74 65 6e 74 20 63 61 63 68 65 20 73 69 7a  istent cache siz
f560: 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20  e value that is 
f570: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
f580: 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
f590: 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20 76 61   itself.  The va
f5a0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
f5b0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
f5c0: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
f5d0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
f5e0: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
f5f0: 66 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c 6f  form sets the lo
f600: 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  cal.  ** page ca
f610: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20  che size value. 
f620: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68 61   It does not cha
f630: 6e 67 65 20 74 68 65 20 70 65 72 73 69 73 74 65  nge the persiste
f640: 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65 20 73 69  nt.  ** cache si
f650: 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ze stored on the
f660: 20 64 69 73 6b 20 73 6f 20 74 68 65 20 63 61 63   disk so the cac
f670: 68 65 20 73 69 7a 65 20 77 69 6c 6c 20 72 65 76  he size will rev
f680: 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73 20  ert.  ** to its 
f690: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 68  default value wh
f6a0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
f6b0: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72 65  is closed and re
f6c0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20 73  opened..  ** N s
f6d0: 68 6f 75 6c 64 20 62 65 20 61 20 70 6f 73 69 74  hould be a posit
f6e0: 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a  ive integer..  *
f6f0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
f700: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63  rICmp(zLeft,"cac
f710: 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  he_size")==0 ){.
f720: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
f730: 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d  p getCacheSize[]
f740: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
f750: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20  ColumnCount, 1, 
f760: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
f770: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
f780: 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
f790: 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d     "cache_size"}
f7a0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
f7b0: 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
f7c0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
f7d0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
f7e0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
f7f0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
f800: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f810: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
f820: 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
f830: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62     int size = db
f840: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20  ->cache_size;;. 
f850: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
f860: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
f870: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f880: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f890: 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20  ger, size, 0);. 
f8a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f8b0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f8c0: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
f8d0: 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
f8e0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f8f0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
f900: 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  atoi(zRight);.  
f910: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
f920: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
f930: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61 63       if( db->cac
f940: 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  he_size<0 ) size
f950: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
f960: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  db->cache_size =
f970: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
f980: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
f990: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62  Size(db->pBe, db
f9a0: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
f9b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
f9c0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
f9d0: 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e  default_synchron
f9e0: 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ous.  **  PRAGMA
f9f0: 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f   default_synchro
fa00: 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a  nous=BOOLEAN.  *
fa10: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
fa20: 20 66 6f 72 6d 20 72 65 74 75 72 6e 73 20 74 68   form returns th
fa30: 65 20 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c  e persistent val
fa40: 75 65 20 6f 66 20 74 68 65 20 22 73 79 6e 63 68  ue of the "synch
fa50: 72 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e 67 0a  ronous" setting.
fa60: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 74 6f    ** that is sto
fa70: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
fa80: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 74 68  ase.  This is th
fa90: 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65  e synchronous se
faa0: 74 74 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20  tting that.  ** 
fab0: 69 73 20 75 73 65 64 20 77 68 65 6e 65 76 65 72  is used whenever
fac0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
fad0: 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f   opened unless o
fae0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 73  verridden by a s
faf0: 65 70 61 72 61 74 65 0a 20 20 2a 2a 20 22 73 79  eparate.  ** "sy
fb00: 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d  nchronous" pragm
fb10: 61 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  a.  The second f
fb20: 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20  orm changes the 
fb30: 70 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20 74  persistent and t
fb40: 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79  he.  ** local sy
fb50: 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e  nchronous settin
fb60: 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67  g to the value g
fb70: 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iven..  **.  ** 
fb80: 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  If synchronous i
fb90: 73 20 6f 6e 2c 20 53 51 4c 69 74 65 20 77 69 6c  s on, SQLite wil
fba0: 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  l do an fsync() 
fbb0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 74 20 73  system call at s
fbc0: 74 72 61 74 65 67 69 63 0a 20 20 2a 2a 20 70 6f  trategic.  ** po
fbd0: 69 6e 74 73 20 74 6f 20 69 6e 73 75 72 65 20 74  ints to insure t
fbe0: 68 61 74 20 61 6c 6c 20 70 72 65 76 69 6f 75 73  hat all previous
fbf0: 6c 79 20 77 72 69 74 74 65 6e 20 64 61 74 61 20  ly written data 
fc00: 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
fc10: 6e 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 6f  n.  ** written o
fc20: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72  nto the disk sur
fc30: 66 61 63 65 20 62 65 66 6f 72 65 20 63 6f 6e 74  face before cont
fc40: 69 6e 75 69 6e 67 2e 20 20 54 68 69 73 20 6d 6f  inuing.  This mo
fc50: 64 65 20 69 6e 73 75 72 65 73 20 74 68 61 74 0a  de insures that.
fc60: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
fc70: 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
fc80: 20 69 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   in a consistent
fc90: 20 73 74 61 74 65 20 65 76 65 6e 74 20 69 66 20   state event if 
fca0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20  the operating.  
fcb0: 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ** system crashe
fcc0: 73 20 6f 72 20 70 6f 77 65 72 20 74 6f 20 74 68  s or power to th
fcd0: 65 20 63 6f 6d 70 75 74 65 72 20 69 73 20 69 6e  e computer is in
fce0: 74 65 72 72 75 70 74 65 64 20 75 6e 65 78 70 65  terrupted unexpe
fcf0: 63 74 65 64 6c 79 2e 0a 20 20 2a 2a 20 57 68 65  ctedly..  ** Whe
fd00: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
fd10: 20 6f 66 66 2c 20 53 51 4c 69 74 65 20 77 69 6c   off, SQLite wil
fd20: 6c 20 6e 6f 74 20 77 61 69 74 20 66 6f 72 20 63  l not wait for c
fd30: 68 61 6e 67 65 73 20 74 6f 20 61 63 74 75 61 6c  hanges to actual
fd40: 6c 79 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ly.  ** be writt
fd50: 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 62  en to the disk b
fd60: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
fd70: 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 69 74  .  As soon as it
fd80: 20 68 61 6e 64 73 20 63 68 61 6e 67 65 73 0a 20   hands changes. 
fd90: 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65 72 61   ** to the opera
fda0: 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 69 74 20  ting system, it 
fdb0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
fdc0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 70 65 72   changes are per
fdd0: 6d 61 6e 65 6e 74 20 61 6e 64 0a 20 20 2a 2a 20  manent and.  ** 
fde0: 69 74 20 63 6f 6e 74 69 6e 75 65 73 20 67 6f 69  it continues goi
fdf0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  ng.  The databas
fe00: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
fe10: 75 70 74 65 64 20 62 79 20 61 20 70 72 6f 67 72  upted by a progr
fe20: 61 6d 20 63 72 61 73 68 0a 20 20 2a 2a 20 65 76  am crash.  ** ev
fe30: 65 6e 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e  en with synchron
fe40: 6f 75 73 20 6f 66 66 2c 20 62 75 74 20 61 6e 20  ous off, but an 
fe50: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
fe60: 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
fe70: 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f 75 6c 64 20  loss.  ** could 
fe80: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63 6f 72 72  potentially corr
fe90: 75 70 74 20 64 61 74 61 2e 20 20 4f 6e 20 74 68  upt data.  On th
fea0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 73 79  e other hand, sy
feb0: 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66 20 69 73  nchronous off is
fec0: 0a 20 20 2a 2a 20 66 61 73 74 65 72 20 74 68 61  .  ** faster tha
fed0: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 6e  n synchronous on
fee0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
fef0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
ff00: 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72  ,"default_synchr
ff10: 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20  onous")==0 ){.  
ff20: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
ff30: 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20  getSync[] = {.  
ff40: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
ff50: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
ff60: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
ff70: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30  P_ReadCookie,  0
ff80: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
ff90: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
ffa0: 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  er,     0, 0,   
ffb0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ffc0: 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20 20   OP_Lt,         
ffd0: 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30 7d   0, 5,        0}
ffe0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64  ,.      { OP_Add
fff0: 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20  Imm,      1, 0, 
10000 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
10010 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
10020 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
10030 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
10040 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
10050 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72  ,        "synchr
10060 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b  onous"},.      {
10070 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
10080 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
10090 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
100a0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
100b0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
100c0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
100d0 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69  urn;.    if( pRi
100e0 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
100f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10100 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
10110 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79   ArraySize(getSy
10120 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20  nc), getSync);. 
10130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10140 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
10150 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63  int size = db->c
10160 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20  ache_size;.     
10170 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
10180 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
10190 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
101a0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
101b0 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  se, 0);.      sq
101c0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
101d0 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
101e0 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 2);.      sql
101f0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10200 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
10210 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
10220 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10230 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
10240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
10250 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
10260 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  , 0, addr+3);.  
10270 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10280 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
10290 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 30 29 3b  , MAX_PAGES, 0);
102a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
102b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73  eAddOp(v, OP_Abs
102c0 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Value, 0, 0);.  
102d0 20 20 20 20 69 66 28 20 21 67 65 74 42 6f 6f 6c      if( !getBool
102e0 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
102f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10300 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
10310 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
10320 20 20 20 20 20 20 73 69 7a 65 20 3d 20 2d 73 69        size = -si
10330 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ze;.      }.    
10340 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10350 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
10360 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
10370 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
10380 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
10390 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
103a0 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
103b0 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
103c0 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
103d0 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
103e0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
103f0 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
10400 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
10410 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ous.  **   PRAGM
10420 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f  A synchronous=BO
10430 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OLEAN.  **.  ** 
10440 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
10450 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
10460 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73   the synchronous
10470 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
10480 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  .  ** the local 
10490 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d  value does not m
104a0 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ake changes to t
104b0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64  he disk file and
104c0 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
104d0 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
104e0 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78  restored the nex
104f0 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
10500 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e  ase is.  ** open
10510 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ed..  */.  if( s
10520 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10530 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  ft,"synchronous"
10540 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
10550 69 63 20 56 64 62 65 4f 70 20 67 65 74 53 79 6e  ic VdbeOp getSyn
10560 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  c[] = {.      { 
10570 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
10580 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
10590 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
105a0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
105b0 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f        "synchrono
105c0 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  us"},.      { OP
105d0 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
105e0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
105f0 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
10600 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10610 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
10620 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10630 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
10640 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
10650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
10660 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10670 65 67 65 72 2c 20 64 62 2d 3e 63 61 63 68 65 5f  eger, db->cache_
10680 73 69 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20 20 20  size>=0, 0);.   
10690 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
106a0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
106b0 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65  ize(getSync), ge
106c0 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73  tSync);.    }els
106d0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
106e0 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
106f0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ze;.      if( si
10700 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
10710 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ize;.      if( !
10720 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
10730 74 29 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  t) ) size = -siz
10740 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63  e;.      db->cac
10750 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a  he_size = size;.
10760 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
10770 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
10780 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65  ->pBe, db->cache
10790 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
107a0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
107b0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
107c0 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68  , "trigger_overh
107d0 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b  ead_test")==0 ){
107e0 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
107f0 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
10800 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65       always_code
10810 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
10820 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
10830 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65       always_code
10840 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
10850 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
10860 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
10870 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76  trICmp(zLeft, "v
10880 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  dbe_trace")==0 )
10890 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
108a0 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
108b0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
108c0 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72  |= SQLITE_VdbeTr
108d0 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ace;.    }else{.
108e0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
108f0 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62 65 54  &= ~SQLITE_VdbeT
10900 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  race;.    }.  }e
10910 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
10920 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
10930 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  "full_column_nam
10940 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  es")==0 ){.    i
10950 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
10960 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
10970 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10980 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
10990 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
109a0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
109b0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
109c0 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  mes;.    }.  }el
109d0 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
109e0 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
109f0 72 65 73 75 6c 74 5f 73 65 74 5f 64 65 74 61 69  result_set_detai
10a00 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ls")==0 ){.    i
10a10 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
10a20 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
10a30 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10a40 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73  TE_ResultDetails
10a50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10a60 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
10a70 7e 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65  ~SQLITE_ResultDe
10a80 74 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  tails;.    }.  }
10a90 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
10aa0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
10ab0 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22   "count_changes"
10ac0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
10ad0 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
10ae0 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
10af0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10b00 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d  CountRows;.    }
10b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
10b20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
10b30 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20  _CountRows;.    
10b40 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
10b50 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10b60 4c 65 66 74 2c 20 22 65 6d 70 74 79 5f 72 65 73  Left, "empty_res
10b70 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 22 29 3d  ult_callbacks")=
10b80 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
10b90 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
10ba0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
10bb0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4e 75  ags |= SQLITE_Nu
10bc0 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  llCallback;.    
10bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
10be0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
10bf0 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a  E_NullCallback;.
10c00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
10c10 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10c20 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65  mp(zLeft, "table
10c30 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  _info")==0 ){.  
10c40 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
10c50 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
10c60 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
10c70 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
10c80 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  t);.    if( pTab
10c90 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74   ) v = sqliteGet
10ca0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10cb0 20 20 69 66 28 20 70 54 61 62 20 26 26 20 76 20    if( pTab && v 
10cc0 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
10cd0 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f  VdbeOp tableInfo
10ce0 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
10cf0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10d00 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c 20 20 20  nCount, 5, 0,   
10d10 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20      0},.        
10d20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10d30 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 63    0, 0,       "c
10d40 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  id"},.        { 
10d50 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
10d60 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
10d70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
10d80 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
10d90 2c 20 30 2c 20 20 20 20 20 20 20 22 74 79 70 65  , 0,       "type
10da0 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
10db0 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 33 2c  _ColumnName,  3,
10dc0 20 30 2c 20 20 20 20 20 20 20 22 6e 6f 74 6e 75   0,       "notnu
10dd0 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  ll"},.        { 
10de0 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
10df0 34 2c 20 30 2c 20 20 20 20 20 20 20 22 64 66 6c  4, 0,       "dfl
10e00 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20 20 20 20  t_value"},.     
10e10 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
10e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
10e30 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
10e40 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66  raySize(tableInf
10e50 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65  oPreface), table
10e60 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20  InfoPreface);.  
10e70 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 47 65      sqliteViewGe
10e80 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
10e90 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
10ea0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
10eb0 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
10ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10ed0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10ee0 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
10ef0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10f00 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
10f10 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10f20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
10f30 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
10f40 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
10f50 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10f60 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10f70 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
10f80 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10f90 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
10fa0 67 65 50 33 28 76 2c 20 2d 31 2c 20 0a 20 20 20  geP3(v, -1, .   
10fb0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
10fc0 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3f 20 70 54  ol[i].zType ? pT
10fd0 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
10fe0 65 20 3a 20 22 74 65 78 74 22 2c 20 50 33 5f 53  e : "text", P3_S
10ff0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
11000 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11010 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
11020 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
11030 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Null, 0);.      
11040 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11050 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
11060 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
11070 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
11080 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61  3(v, -1, pTab->a
11090 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33  Col[i].zDflt, P3
110a0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
110b0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
110c0 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
110d0 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 5, 0);.      }
110e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
110f0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
11100 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
11110 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20  x_info")==0 ){. 
11120 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
11130 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
11140 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
11150 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46    pIdx = sqliteF
11160 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69  indIndex(db, zRi
11170 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ght);.    if( pI
11180 64 78 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47  dx ) v = sqliteG
11190 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
111a0 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
111b0 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  v ){.      stati
111c0 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e  c VdbeOp tableIn
111d0 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  foPreface[] = {.
111e0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
111f0 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20  umnCount, 3, 0, 
11200 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11210 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11220 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
11230 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20  "seqno"},.      
11240 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11250 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
11260 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20  "cid"},.        
11270 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
11280 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    2, 0,       "n
11290 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  ame"},.      };.
112a0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
112b0 20 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e     pTab = pIdx->
112c0 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71  pTable;.      sq
112d0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
112e0 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74  t(v, ArraySize(t
112f0 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
11300 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  , tableInfoPrefa
11310 63 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ce);.      for(i
11320 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
11330 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
11340 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49     int cnum = pI
11350 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
11360 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
11370 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11380 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
11390 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
113a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
113b0 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a  eger, cnum, 0);.
113c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
113d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
113e0 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
113f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
11400 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a  b->nCol>cnum );.
11410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11420 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11430 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  , pTab->aCol[cnu
11440 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  m].zName, P3_STA
11450 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
11460 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11470 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c   OP_Callback, 3,
11480 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11490 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
114a0 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
114b0 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 6c 69  zLeft, "index_li
114c0 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  st")==0 ){.    I
114d0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
114e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
114f0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54   Vdbe *v;.    pT
11500 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
11510 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29  able(db, zRight)
11520 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
11530 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  {.      v = sqli
11540 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
11550 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  );.      pIdx = 
11560 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
11570 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
11580 20 26 26 20 70 49 64 78 20 26 26 20 76 20 29 7b   && pIdx && v ){
11590 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30  .      int i = 0
115a0 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ; .      static 
115b0 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69 73 74  VdbeOp indexList
115c0 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
115d0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
115e0 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20  nCount, 3, 0,   
115f0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20      0},.        
11600 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
11610 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73    0, 0,       "s
11620 65 71 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  eq"},.        { 
11630 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
11640 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
11650 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
11660 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
11670 2c 20 30 2c 20 20 20 20 20 20 20 22 75 6e 69 71  , 0,       "uniq
11680 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a  ue"},.      };..
11690 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
116a0 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
116b0 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74  aySize(indexList
116c0 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c  Preface), indexL
116d0 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20  istPreface);.   
116e0 20 20 20 77 68 69 6c 65 28 70 49 64 78 29 7b 0a     while(pIdx){.
116f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11700 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
11710 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
11720 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11730 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
11740 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
11750 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
11760 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
11770 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
11780 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
11790 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
117a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
117b0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
117c0 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  one, 0);.       
117d0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
117e0 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
117f0 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   3, 0);.        
11800 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ++i;.        pId
11810 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b  x = pIdx->pNext;
11820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11830 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
11840 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
11850 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11860 2c 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22  , "parser_trace"
11870 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65  )==0 ){.    exte
11880 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61  rn void sqlitePa
11890 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c  rserTrace(FILE*,
118a0 20 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66   char *);.    if
118b0 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
118c0 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ght) ){.      sq
118d0 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
118e0 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a  stdout, "parser:
118f0 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
11900 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73        sqlitePars
11910 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20  erTrace(0, 0);. 
11920 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
11930 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
11940 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
11950 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  "integrity_check
11960 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
11970 74 69 63 20 56 64 62 65 4f 70 20 63 68 65 63 6b  tic VdbeOp check
11980 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  Db[] = {.      {
11990 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
119a0 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 32   0, 0,        "2
119b0 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  "},.      { OP_O
119c0 70 65 6e 2c 20 20 20 20 20 20 20 20 30 2c 20 32  pen,        0, 2
119d0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
119e0 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
119f0 20 20 20 20 20 30 2c 20 36 2c 20 20 20 20 20 20       0, 6,      
11a00 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11a10 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 30 2c  _Column,      0,
11a20 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   3,        0},. 
11a30 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
11a40 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
11a50 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
11a60 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
11a70 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
11a80 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
11a90 67 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20  grityCk, 0, 0,  
11aa0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11ab0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
11ac0 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 1, 0,        0
11ad0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
11ae0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
11af0 20 20 20 20 20 20 20 20 22 69 6e 74 65 67 72 69          "integri
11b00 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20  ty_check"},.    
11b10 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
11b20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
11b30 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
11b40 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11b50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
11b60 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
11b70 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
11b80 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
11b90 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63 68 65  v, ArraySize(che
11ba0 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b  ckDb), checkDb);
11bb0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20  .  }else..  {}. 
11bc0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
11bd0 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
11be0 28 7a 52 69 67 68 74 29 3b 0a 7d 0a              (zRight);.}.