/ Hex Artifact Content
Login

Artifact 0f3c6b6482e0b74284b22661de1b813a0bfb0197:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 38 35 20 32 30 30  ild.c,v 1.85 200
0310: 32 2f 30 33 2f 30 35 20 30 31 3a 31 31 3a 31 33  2/03/05 01:11:13
0320: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0330: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0340: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0350: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0360: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0370: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0380: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0390: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03a0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03b0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03c0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03d0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
03f0: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0400: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0410: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0420: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0430: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0440: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0450: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0460: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0470: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0480: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
0490: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04b0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04c0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04d0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04e0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
04f0: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0500: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0520: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0530: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0540: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0550: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0560: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0570: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0580: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
0590: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05a0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05b0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05d0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05e0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0610: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0630: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0640: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0650: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0660: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0670: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0680: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
0690: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06a0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06b0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06c0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06d0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06e0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0700: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0710: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0740: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0750: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0760: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0770: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0780: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
0790: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07a0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07c0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07d0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07e0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
07f0: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
0810: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0830: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0840: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0850: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0860: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0870: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0880: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0890: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
08a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
08b0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
08c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
08d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c    Table *p = sql
08e0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
08f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
0900: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
0910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
0920: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0930: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0940: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0950: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0960: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0970: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0980: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
0990: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
09a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
09b0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
09c0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
09d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
09e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73  {.  Index *p = s
09f0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0a00: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0a10: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0a20: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0a40: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0a50: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0a60: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0a70: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0a80: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0a90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0aa0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0ab0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0ac0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0ad0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0ae0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
0af0: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
0b00: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
0b10: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
0b20: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
0b30: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
0b40: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
0b50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
0b60: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0b70: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
0b80: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
0b90: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
0ba0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
0bb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
0bc0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
0bd0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
0be0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
0bf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
0c00: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
0c10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
0c20: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c30: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
0c40: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
0c50: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
0c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
0c70: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
0c80: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
0c90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
0cb0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0cc0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
0cd0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
0ce0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
0cf0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d00: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
0d10: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
0d20: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0d30: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
0d40: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
0d50: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
0d60: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
0d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
0d80: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
0d90: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
0da0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
0db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
0dc0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
0dd0: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
0de0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
0df0: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
0e00: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
0e10: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
0e20: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
0e30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
0e40: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
0e50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
0e60: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
0e70: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
0e80: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
0e90: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
0ea0: 78 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  x to the pending
0eb0: 20 44 52 4f 50 20 49 4e 44 45 58 20 71 75 65 75   DROP INDEX queu
0ec0: 65 20 69 66 20 69 74 20 68 61 73 0a 2a 2a 20 62  e if it has.** b
0ed0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  een committed.  
0ee0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 77 61  If this index wa
0ef0: 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65  s never committe
0f00: 64 2c 20 74 68 65 6e 20 6a 75 73 74 0a 2a 2a 20  d, then just.** 
0f10: 64 65 6c 65 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  delete it..**.**
0f20: 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   Indices on the 
0f30: 70 65 6e 64 69 6e 67 20 64 72 6f 70 20 71 75 65  pending drop que
0f40: 75 65 20 61 72 65 20 64 65 6c 65 74 65 64 20 77  ue are deleted w
0f50: 68 65 6e 20 61 20 43 4f 4d 4d 49 54 20 69 73 0a  hen a COMMIT is.
0f60: 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  ** executed.  If
0f70: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75   a ROLLBACK occu
0f80: 72 73 2c 20 74 68 65 20 69 6e 64 69 63 65 73 20  rs, the indices 
0f90: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
0fa0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  nto.** the main 
0fb0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fd0: 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72   sqlitePendingDr
0fe0: 6f 70 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  opIndex(sqlite *
0ff0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1000: 20 69 66 28 20 21 70 2d 3e 69 73 43 6f 6d 6d 69   if( !p->isCommi
1010: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  t ){.    sqliteU
1020: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1030: 64 65 78 28 64 62 2c 20 70 29 3b 0a 20 20 7d 65  dex(db, p);.  }e
1040: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1050: 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  pOld;.    pOld =
1060: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1070: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
1080: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
1090: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
10a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
10b0: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
10c0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
10d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10e0: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
10f0: 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a  , strlen(pOld->z
1100: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
1110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1120: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1130: 69 64 78 44 72 6f 70 2c 20 70 2c 20 30 2c 20 70  idxDrop, p, 0, p
1140: 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 72 6f 70  );.    p->isDrop
1150: 70 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ped = 1;.  }.}..
1160: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1170: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1180: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
1190: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
11a0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
11b0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11c0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
11d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
11e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
11f0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
1200: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
1210: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
1220: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
1230: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1240: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1250: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
1260: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1270: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1280: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
1290: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
12b0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
12c0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
12d0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
12e0: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
12f0: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
1300: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
1310: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
1320: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
1330: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
1340: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
1350: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
1360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
1370: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
1380: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  id sqliteDeleteT
1390: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
13a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
13b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65  .  int i;.  Inde
13c0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
13d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  t;.  if( pTable=
13e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
1400: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1420: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
1430: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
1440: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1450: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
1460: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1470: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
1480: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e  );.  }.  for(pIn
1490: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
14a0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
14b0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
14c0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
14d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
14e0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
14f0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
1500: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1510: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
1520: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1530: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
1540: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
1550: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
1560: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1570: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
1580: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
1590: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
15a0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
15b0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
15c0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
15d0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
15e0: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
15f0: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1600: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
1610: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
1620: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
1630: 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  pOld;.  assert( 
1640: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1650: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1660: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1670: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1680: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
16a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
16b0: 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49  );.  sqliteHashI
16c0: 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44 72  nsert(&db->tblDr
16d0: 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  op, p, 0, 0);.  
16e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
16f0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1700: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69 76 65  ** Move the give
1710: 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 70  n table to the p
1720: 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41 42 4c  ending DROP TABL
1730: 45 20 71 75 65 75 65 20 69 66 20 69 74 20 68 61  E queue if it ha
1740: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d 69 74  s.** been commit
1750: 74 65 64 2e 20 20 49 66 20 74 68 69 73 20 74 61  ted.  If this ta
1760: 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20 63 6f  ble was never co
1770: 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6a 75  mmitted, then ju
1780: 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69 74 2e  st.** delete it.
1790: 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20 66 6f    Do the same fo
17a0: 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  r all its indice
17b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f  s..**.** Table o
17c0: 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65 75 65  n the drop queue
17d0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
17e0: 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69 6c 20  y deleted until 
17f0: 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74 61 74  a COMMIT.** stat
1800: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
1810: 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42 41 43  d.  If a ROLLBAC
1820: 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65 61 64  K occurs instead
1830: 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a 2a 2a   of a COMMIT,.**
1840: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   then the tables
1850: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1860: 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63  ue are moved bac
1870: 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a  k into the main.
1880: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ** hash table..*
1890: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18a0: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 54  litePendingDropT
18b0: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
18c0: 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b 0a 20   Table *pTbl){. 
18d0: 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73 43 6f   if( !pTbl->isCo
18e0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
18f0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1900: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62 6c 29  eTable(db, pTbl)
1910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
1920: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
1930: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
1940: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c 64 20  pNext;.    pOld 
1950: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1960: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1970: 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74   pTbl->zName, st
1980: 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61 6d 65  rlen(pTbl->zName
1990: 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73 73 65  )+1,0);.    asse
19a0: 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c 20 29  rt( pOld==pTbl )
19b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
19c0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 44  Insert(&db->tblD
19d0: 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20 70 54  rop, pTbl, 0, pT
19e0: 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  bl);.    for(pIn
19f0: 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49 6e 64  dex = pTbl->pInd
1a00: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a10: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  ex=pNext){.     
1a20: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
1a30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a40: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
1a50: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54  *.** Check all T
1a80: 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65  ables and Indexe
1a90: 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  s in the interna
1aa0: 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  l hash table and
1ab0: 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61   commit.** any a
1ac0: 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65  dditions or dele
1ad0: 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68  tions to those h
1ae0: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ash tables..**.*
1af0: 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67  * When executing
1b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e   CREATE TABLE an
1b10: 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  d CREATE INDEX s
1b20: 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54  tatements, the T
1b30: 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65  able.** and Inde
1b40: 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65  x structures are
1b50: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
1b60: 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ed to the hash t
1b70: 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68  ables, but.** th
1b80: 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65  e "isCommit" fie
1b90: 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20  ld is not set.  
1ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1bb0: 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  s those fields..
1bc0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1bd0: 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64  g DROP TABLE and
1be0: 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65   DROP INDEX, the
1bf0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1c00: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1c10: 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66 20 74  e moved out of t
1c20: 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78 48 61  blHash and idxHa
1c30: 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f 70 20  sh into tblDrop 
1c40: 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20 54 68  and idxDrop.  Th
1c50: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 65  is.** routine de
1c60: 6c 65 74 65 73 20 74 68 65 20 73 74 72 75 63 74  letes the struct
1c70: 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70 20 61  ure in tblDrop a
1c80: 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a 0a 2a  nd idxDrop..**.*
1c90: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
1ca0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1cb0: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
1cc0: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1cd0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1ce0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48  sqlite *db){.  H
1cf0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
1d00: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
1d10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
1d20: 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20 72 65  Changes)==0 ) re
1d30: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63 68 65  turn;.  db->sche
1d40: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1d50: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1d60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1d70: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1d80: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1d90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1da0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1db0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1dc0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1dd0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54 61 62  pElem);.    pTab
1de0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  le->isCommit = 1
1df0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  ;.  }.  for(pEle
1e00: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1e10: 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70 29 3b  t(&db->tblDrop);
1e20: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e30: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e40: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1e50: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1e60: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1e80: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
1e90: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1ea0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 74  HashClear(&db->t
1eb0: 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72 28 70  blDrop);.  for(p
1ec0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1ed0: 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61 73  irst(&db->idxHas
1ee0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
1ef0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1f00: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1f10: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1f20: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1f30: 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  m);.    pIndex->
1f40: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1f50: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45 6c 65  }.  while( (pEle
1f60: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f70: 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29 29  t(&db->idxDrop))
1f80: 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  !=0 ){.    Index
1f90: 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74   *pIndex = sqlit
1fa0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  ;.    sqliteUnli
1fc0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1fd0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1fe0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
1ff0: 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ear(&db->idxDrop
2000: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2010: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2020: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2030: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2040: 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20  uns when one or 
2050: 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41 42 4c  more CREATE TABL
2060: 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58 2c  E, CREATE INDEX,
2070: 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c 20  .** DROP TABLE, 
2080: 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  or DROP INDEX st
2090: 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20 72 6f  atements gets ro
20a0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68 65 0a  lled back.  The.
20b0: 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20  ** additions or 
20c0: 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61 62  deletions of Tab
20d0: 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72  le and Index str
20e0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 0a 2a  uctures in the.*
20f0: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
2100: 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64 6f 6e  tables are undon
2110: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
2120: 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  o: sqliteCommitI
2130: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29  nternalChanges()
2140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
2150: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2160: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2170: 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65 6c  b){.  Hash toDel
2180: 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  ete;.  HashElem 
2190: 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28 64  *pElem;.  if( (d
21a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
21b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
21c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
21d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
21e0: 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54 45  toDelete, SQLITE
21f0: 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20 30  _HASH_POINTER, 0
2200: 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  );.  db->next_co
2210: 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d  okie = db->schem
2220: 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72 28  a_cookie;.  for(
2230: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2240: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
2250: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
2260: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2270: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
2280: 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71  ble *pTable = sq
2290: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
22a0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  em);.    if( !pT
22b0: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  able->isCommit )
22c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
22d0: 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65  shInsert(&toDele
22e0: 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20 70  te, pTable, 0, p
22f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
2300: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
2310: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2320: 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d 3b  oDelete); pElem;
2330: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2340: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2350: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2360: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2370: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
2380: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
2390: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
23a0: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
23b0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 6f 44  teHashClear(&toD
23c0: 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28 70 45  elete);.  for(pE
23d0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23e0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
23f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2400: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2410: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
2420: 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20 73 71  e *pOld, *p = sq
2430: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2440: 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
2450: 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   p->isCommit );.
2460: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
2470: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
2480: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
2490: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
24a0: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
24b0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
24c0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
24d0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
24e0: 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  ear(&db->tblDrop
24f0: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2500: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2510: 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  db->idxHash); pE
2520: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2530: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2540: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
2550: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48 61 73  ndex = sqliteHas
2560: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2570: 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 69    if( !pIndex->i
2580: 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  sCommit ){.     
2590: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
25a0: 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70 49 6e  t(&toDelete, pIn
25b0: 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78 29 3b  dex, 0, pIndex);
25c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
25d0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
25e0: 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65  hFirst(&toDelete
25f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2600: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
2610: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
2620: 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  x *pIndex = sqli
2630: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  );.    sqliteUnl
2650: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2660: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
2670: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2680: 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b  lear(&toDelete);
2690: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
26a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
26b0: 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45 6c 65  ->idxDrop); pEle
26c0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
26d0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
26e0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  .    Index *pOld
26f0: 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73  , *p = sqliteHas
2700: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2710: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 43    assert( p->isC
2720: 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70 2d 3e  ommit );.    p->
2730: 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b 0a 20  isDropped = 0;. 
2740: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
2750: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2760: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2770: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2780: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 61  me)+1, p);.    a
2790: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
27a0: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 7d  | pOld==p );.  }
27b0: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
27c0: 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 29  ar(&db->idxDrop)
27d0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
27e0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
27f0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2800: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e   Construct the n
2810: 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61  ame of a user ta
2820: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f  ble or index fro
2830: 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  m a token..**.**
2840: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2850: 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  he name is obtai
2860: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
2870: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
2880: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
2890: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
28a0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
28b0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
28c0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
28d0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
28e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
28f0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
2900: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
2910: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
2920: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
2940: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
2950: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
2960: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
2970: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
2980: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
2990: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
29a0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
29b0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
29c0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
29d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
29e0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
29f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a00: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
2a10: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
2a20: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
2a30: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
2a40: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
2a50: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
2a60: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
2a70: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
2a80: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
2a90: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
2aa0: 72 75 65 20 69 66 20 74 68 65 20 22 54 45 4d 50  rue if the "TEMP
2ab0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
2ac0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
2ad0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
2ae0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
2af0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
2b00: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
2b10: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
2b20: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
2b30: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
2b40: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
2b50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2b60: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
2b70: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
2b80: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
2b90: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
2ba0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2bb0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
2bc0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
2bd0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
2be0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
2bf0: 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  e sqliteEndTable
2c00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
2c10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
2c20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
2c30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
2c40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
2c50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72  .void sqliteStar
2c60: 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  tTable(Parse *pP
2c70: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74  arse, Token *pSt
2c80: 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  art, Token *pNam
2c90: 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  e, int isTemp){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
2cb0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2cc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2cd0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
2ce0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
2cf0: 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e   *v;..  pParse->
2d00: 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70  sFirstToken = *p
2d10: 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d  Start;.  zName =
2d20: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
2d30: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
2d40: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
2d50: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
2d60: 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   Before trying t
2d70: 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f  o create a tempo
2d80: 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65  rary table, make
2d90: 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20   sure the Btree 
2da0: 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67  for.  ** holding
2db0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2dc0: 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  s is open..  */.
2dd0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
2de0: 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29  db->pBeTemp==0 )
2df0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2e00: 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30  qliteBtreeOpen(0
2e10: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
2e20: 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20  &db->pBeTemp);. 
2e30: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2e50: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2e60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2e70: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
2e80: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
2e90: 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
2ea0: 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
2eb0: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
2ec0: 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  es", 0);.      p
2ed0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2ef0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
2f00: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f10: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
2f20: 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42  c = sqliteBtreeB
2f30: 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42  eginTrans(db->pB
2f40: 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  eTemp);.      if
2f50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f70: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2f80: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
2f90: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
2fa0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
2fb0: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
2fc0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
2fd0: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
2fe0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2ff0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3000: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3010: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3020: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3030: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3040: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3050: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3060: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3070: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3080: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3090: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
30a0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
30b0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
30c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
30d0: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
30e0: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
30f0: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3100: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3110: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3120: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3130: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3140: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3150: 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e 65  en ignore the ne
3160: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
3170: 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  e..  ** We will 
3180: 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67  continue parsing
3190: 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73 65  , but the pParse
31a0: 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61 67  ->nameClash flag
31b0: 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20 2a   will be set.  *
31c0: 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  * so we will kno
31d0: 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68 65  w to discard the
31e0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f 6e   table record on
31f0: 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20 66  ce parsing has f
3200: 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  inished..  */.  
3210: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
3220: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
3230: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
3240: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e!=0 ){.    if( 
3250: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26  pTable->isTemp &
3260: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
3270: 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ag ){.      pPar
3280: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3290: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
32a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
32b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
32c0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
32d0: 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e   0, pName->z, pN
32e0: 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20  ame->n,.        
32f0: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
3300: 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ts", 0, 0);.    
3310: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3320: 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
3330: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3340: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
3360: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d 20  se->nameClash = 
3370: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  0;.  }.  if( (pI
3380: 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  dx = sqliteFindI
3390: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29  ndex(db, zName))
33a0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
33b0: 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   (!pIdx->pTable-
33c0: 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72  >isTemp || !pPar
33d0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
33e0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
33f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3400: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
3410: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3420: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
3430: 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20     zName, 0);.  
3440: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3450: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
3460: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
3470: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3480: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3490: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
34a0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
34b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
34c0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
34d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
34e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
34f0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
3500: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3510: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3520: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3530: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3540: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3550: 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73 54  le->isTemp = isT
3560: 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73  emp;.  if( pPars
3570: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
3580: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
3590: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
35a0: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
35b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
35c0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
35d0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
35e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
35f0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
3600: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
3610: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
3620: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
3630: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
3640: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
3650: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
3660: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
3670: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
3680: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
3690: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
36a0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
36b0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
36c0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
36d0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
36e0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
36f0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
3700: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
3710: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
3720: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
3730: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
3740: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
3750: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3760: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
3770: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
3780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
3790: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
37a0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74  & (v = sqliteGet
37b0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
37c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65   ){.    sqliteBe
37d0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
37e0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  n(pParse);.    i
37f0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
3800: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3810: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3820: 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  r, db->file_form
3830: 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  at, 0);.      sq
3840: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3850: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
3860: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3870: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3880: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
3890: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
38a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
38b0: 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  -1, MASTER_NAME,
38c0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
38d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
38e0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
38f0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3900: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3910: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
3920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3930: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3940: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
3950: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3960: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
3970: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ey, 0, 0);.    }
3980: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3990: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
39a0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
39b0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
39c0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
39d0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
39e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
39f0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3a00: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
3a10: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
3a20: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
3a30: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
3a40: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
3a50: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
3a60: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
3a70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
3a80: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
3a90: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
3aa0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
3ab0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
3ac0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
3ad0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
3ae0: 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66   char **pz;.  if
3af0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
3b00: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
3b10: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d  eturn;.  if( (p-
3b20: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
3b30: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
3b40: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
3b50: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
3b60: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
3b70: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
3b80: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
3b90: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
3ba0: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
3bb0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d   aNew;.  }.  mem
3bc0: 73 65 74 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  set(&p->aCol[p->
3bd0: 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nCol], 0, sizeof
3be0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
3bf0: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70   pz = &p->aCol[p
3c00: 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b  ->nCol++].zName;
3c10: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
3c20: 69 6e 67 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a  ing(pz, pName->z
3c30: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
3c40: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
3c50: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  *pz);.}../*.** T
3c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3c70: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3c80: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
3c90: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
3ca0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
3cb0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3cc0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
3cd0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
3ce0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
3cf0: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
3d00: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
3d10: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
3d20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
3d30: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3d40: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3d50: 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75  d sqliteAddNotNu
3d60: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
3d70: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
3d80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
3d90: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
3da0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3db0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
3dc0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
3dd0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
3de0: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
3df0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
3e00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3e10: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
3e20: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
3e30: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
3e40: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
3e50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3e60: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
3e70: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
3e80: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
3e90: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
3ea0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
3eb0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
3ec0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
3ed0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
3ee0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
3ef0: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
3f00: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
3f10: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
3f20: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
3f30: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
3f40: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
3f50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
3f60: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
3f70: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
3f80: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
3f90: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
3fa0: 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54  sqliteAddColumnT
3fb0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
3fc0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74  e, Token *pFirst
3fd0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b  , Token *pLast){
3fe0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
3ff0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
4000: 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70  ;.  char *z, **p
4010: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
4020: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4030: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4040: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4050: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
4060: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
4070: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b 0a 20 20 6e  ol[i].zType;.  n
4080: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64   = pLast->n + Ad
4090: 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41  dr(pLast->z) - A
40a0: 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a  ddr(pFirst->z);.
40b0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
40c0: 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a  ng(pz, pFirst->z
40d0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a  , n, 0);.  z = *
40e0: 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  pz;.  if( z==0 )
40f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4100: 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  =j=0; z[i]; i++)
4110: 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b  {.    int c = z[
4120: 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70  i];.    if( issp
4130: 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75  ace(c) ) continu
4140: 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  e;.    z[j++] = 
4150: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
4160: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
4170: 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74  given token is t
4180: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
4190: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f   for the last co
41a0: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a  lumn added to.**
41b0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
41c0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
41d0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69  ruction.  If "mi
41e0: 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65  nusFlag" is true
41f0: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
4200: 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61  e value token wa
4210: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
4220: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
4230: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4240: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4250: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4260: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4270: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4280: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4290: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
42a0: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
42b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
42c0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
42d0: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
42e0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
42f0: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
4300: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
4310: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
4320: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4330: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4340: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
4350: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69   pz = &p->aCol[i
4360: 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d  ].zDflt;.  if( m
4370: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
4380: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4390: 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61  (pz, "-", 1, pVa
43a0: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
43b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
43c0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
43d0: 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  (pz, pVal->z, pV
43e0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20  al->n, 0);.  }. 
43f0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
4400: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
4410: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
4420: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
4430: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
4440: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
4450: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
4460: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
4470: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
4480: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
4490: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
44a0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
44b0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
44c0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
44d0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
44e0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
44f0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
4500: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
4510: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
4520: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
4530: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
4540: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
4550: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
4560: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
4570: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
4580: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
4590: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
45a0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
45b0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
45c0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
45d0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
45e0: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
45f0: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
4600: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
4610: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
4620: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
4630: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
4640: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
4650: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
4660: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
4670: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
4680: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
4690: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
46a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
46b0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
46c0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
46d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
46e0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
46f0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
4700: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
4710: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
4720: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
4730: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
4740: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
4750: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
4760: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
4770: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
4780: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
4790: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
47a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
47b0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
47c0: 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79  iteAddPrimaryKey
47d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
47e0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  IdList *pList, i
47f0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
4800: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
4810: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
4820: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
4830: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
4840: 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -1;.  if( pTab==
4850: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
4860: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
4870: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
4880: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4890: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
48a0: 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  le \"", pTab->zN
48b0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c  ame, .        "\
48c0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
48d0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
48e0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
48f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
4900: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
4910: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
4920: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
4930: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
4940: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
4950: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
4960: 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20  ->nId==1 ){.    
4970: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
4980: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
4990: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
49a0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
49b0: 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ist->a[0].zName,
49c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
49d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
49e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
49f0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
4a00: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
4a10: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
4a20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
4a30: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
4a40: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
4a50: 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a  e_format>=1 && .
4a60: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
4a70: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
4a80: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
4a90: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
4aa0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
4ab0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
4ac0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
4ae0: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  teCreateIndex(pP
4af0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73  arse, 0, 0, pLis
4b00: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
4b10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4b20: 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e  Come up with a n
4b30: 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  ew random value 
4b40: 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  for the schema c
4b50: 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72  ookie.  Make sur
4b60: 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c  e.** the new val
4b70: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ue is different 
4b80: 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a  from the old..**
4b90: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
4ba0: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
4bb0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
4bc0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
4bd0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
4be0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
4bf0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
4c00: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
4c10: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
4c20: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
4c30: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
4c40: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
4c50: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
4c60: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
4c70: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
4c80: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
4c90: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
4ca0: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
4cb0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
4cc0: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
4cd0: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
4ce0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
4cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
4d00: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
4d10: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
4d20: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
4d30: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
4d40: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
4d50: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
4d60: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
4d70: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
4d80: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
4d90: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
4da0: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
4db0: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
4dc0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
4dd0: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
4de0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
4df0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
4e00: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
4e10: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
4e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e30: 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c  changeCookie(sql
4e40: 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  ite *db){.  if( 
4e50: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d  db->next_cookie=
4e60: 3d 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  =db->schema_cook
4e70: 69 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65  ie ){.    db->ne
4e80: 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  xt_cookie = db->
4e90: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20  schema_cookie + 
4ea0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65  sqliteRandomByte
4eb0: 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e  () + 1;.    db->
4ec0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4ed0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
4ee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73   }.}../*.** Meas
4ef0: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
4f00: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
4f10: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
4f20: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
4f30: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
4f40: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
4f50: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
4f60: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
4f70: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
4f80: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
4f90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4fa0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
4fb0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
4fc0: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51  t n;.  int needQ
4fd0: 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  uote = 0;.  for(
4fe0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
4ff0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
5000: 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65  '\'' ){ n++; nee
5010: 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a  dQuote=1; }.  }.
5020: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65    return n + nee
5030: 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a  dQuote*2;.}../*.
5040: 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e  ** Write an iden
5050: 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20  tifier onto the 
5060: 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  end of the given
5070: 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a   string.  Add.**
5080: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
5090: 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s as needed..*/.
50a0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
50b0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
50c0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
50d0: 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c  Ident){.  int i,
50e0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
50f0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
5100: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
5110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
5120: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
5130: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
5140: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
5150: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
5160: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
5170: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
5180: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
5190: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
51a0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
51b0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
51c0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
51d0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
51e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
51f0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
5200: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
5210: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
5220: 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b  nt[j]=='\'' ) z[
5230: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d  i++] = '\'';.  }
5240: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
5250: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
5260: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
5270: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
5280: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
5290: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
52a0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
52b0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
52c0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
52d0: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
52e0: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
52f0: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
5300: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
5310: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
5320: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
5330: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
5350: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
5360: 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  t(Table *p){.  i
5370: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
5380: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
5390: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
53a0: 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b   *zEnd;.  n = 0;
53b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
53c0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
53d0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
53e0: 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  h(p->aCol[i].zNa
53f0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  me);.  }.  n += 
5400: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
5410: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34  Name);.  if( n<4
5420: 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  0 ){.    zSep = 
5430: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
5440: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
5450: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
5460: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
5470: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
5480: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
5490: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
54a0: 2b 3d 20 32 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 25 + 6*p->nCo
54b0: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
54c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a  iteMalloc( n );.
54d0: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
54e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
54f0: 65 72 74 28 20 21 70 2d 3e 69 73 54 65 6d 70 20  ert( !p->isTemp 
5500: 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  );.  strcpy(zStm
5510: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
5520: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
5530: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
5540: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
5550: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
5560: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
5570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5580: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
5590: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
55a0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
55b0: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
55c0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
55d0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
55e0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
55f0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
5600: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
5610: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
5620: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
5630: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5640: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5650: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
5660: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
5670: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
5680: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5690: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
56a0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
56b0: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
56c0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
56d0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
56e0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
56f0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
5700: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
5710: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
5720: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
5730: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
5740: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
5750: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
5760: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20  ble on disk,.** 
5770: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
5780: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
5790: 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e   or initFlag==1.
57a0: 20 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d    When initFlag=
57b0: 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  =1,.** it means 
57c0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
57d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
57e0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
57f0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
5800: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
5810: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
5820: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
5830: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
5840: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
5850: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
5860: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
5870: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
5880: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5890: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
58a0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
58b0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
58c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
58d0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
58e0: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
58f0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
5900: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
5910: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
5920: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
5930: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
5940: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
5950: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
5960: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
5970: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
5980: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
5990: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
59a0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
59b0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
59c0: 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  teEndTable(Parse
59d0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
59e0: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
59f0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
5a00: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *p;.  sqlite *d
5a10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5a20: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
5a30: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
5a40: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
5a50: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
5a60: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5a70: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
5a80: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
5a90: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
5aa0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
5ab0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
5ac0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
5ad0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
5ae0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  se..  */.  asser
5af0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  t( pParse->nameC
5b00: 6c 61 73 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73  lash==0 || pPars
5b10: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29  e->initFlag==1 )
5b20: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
5b30: 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50  explain==0 && pP
5b40: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d  arse->nameClash=
5b50: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
5b60: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20  *pOld;.    pOld 
5b70: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
5b80: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
5b90: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
5ba0: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
5bb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
5bc0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5bd0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
5be0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
5bf0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
5c00: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
5c10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5c20: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
5c30: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
5c40: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
5c50: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5c60: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
5c70: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
5c80: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
5c90: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
5ca0: 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63  a SELECT, then c
5cb0: 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a  onstruct the.  *
5cc0: 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * list of column
5cd0: 73 20 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f  s and the text o
5ce0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
5cf0: 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  /.  if( pSelect 
5d00: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53  ){.    Table *pS
5d10: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65  elTab = sqliteRe
5d20: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
5d30: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
5d40: 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65  ct);.    if( pSe
5d50: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
5d60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
5d70: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
5d80: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
5d90: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  b->nCol;.    p->
5da0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
5db0: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
5dc0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
5dd0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
5de0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   0;.    sqliteDe
5df0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
5e00: 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lTab);.  }..  /*
5e10: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
5e20: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
5e30: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
5e40: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
5e50: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
5e60: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
5e70: 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  disk.  So do not
5e80: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
5e90: 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20  sk.  ** again.  
5ea0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
5eb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
5ec0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
5ed0: 74 68 65 20 0a 20 20 2a 2a 20 70 50 61 72 73 65  the .  ** pParse
5ee0: 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  ->newTnum field.
5ef0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
5f00: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  er should have b
5f10: 65 65 6e 20 70 75 74 0a 20 20 2a 2a 20 74 68 65  een put.  ** the
5f20: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
5f30: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
5f40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
5f50: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
5f60: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50      p->tnum = pP
5f70: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20  arse->newTnum;. 
5f80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
5f90: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
5fa0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
5fb0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
5fc0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
5fd0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
5fe0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
5ff0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
6000: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
6010: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
6020: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
6030: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
6040: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
6050: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
6060: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 74 68  PORARY table, th
6070: 65 6e 20 6a 75 73 74 20 63 72 65 61 74 65 20 74  en just create t
6080: 68 65 20 74 61 62 6c 65 2e 20 20 44 6f 20 6e 6f  he table.  Do no
6090: 74 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 6e 20 65  t.  ** make an e
60a0: 6e 74 72 79 20 69 6e 20 53 51 4c 49 54 45 5f 4d  ntry in SQLITE_M
60b0: 41 53 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ASTER..  */.  if
60c0: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
60d0: 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  lag ){.    int n
60e0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
60f0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
6100: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6110: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
6120: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d  turn;.    if( p-
6130: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
6140: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
6150: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
6160: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6170: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6180: 6c 65 2c 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70  le, 0, p->isTemp
6190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
61a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
61b0: 31 2c 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74  1, (char *)&p->t
61c0: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
61d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
61e0: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
61f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6210: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6220: 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
6230: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69  0;.    if( !p->i
6240: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
6250: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6260: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6270: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6280: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
6290: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
62a0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
62b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
62c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
62d0: 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65  P3(v, -1, "table
62e0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
62f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6300: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6310: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 76  angeP3(v, -1, "v
6320: 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29  iew", P3_STATIC)
6330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6340: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6350: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
6360: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6370: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6380: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6390: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
63a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
63b0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
63c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
63d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
63e0: 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  , -1, p->zName, 
63f0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6400: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6410: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20  p(v, OP_Dup, 4, 
6420: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6440: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6450: 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
6460: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
6470: 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c   *z = createTabl
6480: 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  eStmt(p);.      
6490: 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e    n = z ? strlen
64a0: 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  (z) : 0;.       
64b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
64c0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
64d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
64e0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 7d  Free(z);.      }
64f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6500: 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b  sert( pEnd!=0 );
6510: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41 64 64  .        n = Add
6520: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
6530: 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  r(pParse->sFirst
6540: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
6550: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6560: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6570: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
6580: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  ken.z, n);.     
6590: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
65a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
65b0: 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29  akeRecord, 5, 0)
65c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
65d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
65e0: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
65f0: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
6600: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71  ie(db);.      sq
6610: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6620: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6630: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29  >next_cookie, 0)
6640: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6650: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
6660: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a  tCookie, 0, 0);.
6670: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6680: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
6690: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  e, 0, 0);.    }.
66a0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
66b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
66c0: 3d 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  = p->isTemp ? OP
66d0: 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f  _OpenWrAux : OP_
66e0: 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
66f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6700: 28 76 2c 20 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  (v, op, 1, 0);. 
6710: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
6720: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
6730: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
6740: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
6750: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
6760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6770: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
6780: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
6790: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
67a0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
67b0: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
67c0: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
67d0: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
67e0: 71 6c 69 74 65 43 72 65 61 74 65 56 69 65 77 28  qliteCreateView(
67f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6800: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
6810: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6820: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
6830: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
6840: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
6850: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
6860: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
6870: 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  Name,      /* Th
6880: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
6890: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
68a0: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
68b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
68c0: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
68d0: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
68e0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
68f0: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65  iew */.){.  Toke
6900: 6e 20 73 45 6e 64 3b 0a 20 20 54 61 62 6c 65 20  n sEnd;.  Table 
6910: 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p;.  const char
6920: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 2c 20 6f 66   *z;.  int n, of
6930: 66 73 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65 53  fset;..  sqliteS
6940: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
6950: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c  , pBegin, pName,
6960: 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   0);.  p = pPars
6970: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
6980: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
6990: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
69a0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
69b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
69c0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
69d0: 65 63 74 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ect;.  if( !pPar
69e0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
69f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 56 69      if( sqliteVi
6a00: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
6a10: 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
6a20: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6a30: 20 7d 0a 20 20 7d 0a 20 20 73 45 6e 64 20 3d 20   }.  }.  sEnd = 
6a40: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
6a50: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
6a60: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
6a70: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
6a80: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
6a90: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
6aa0: 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29   0;.  n = ((int)
6ab0: 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70  sEnd.z) - (int)p
6ac0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
6ad0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
6ae0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
6af0: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
6b00: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
6b10: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
6b20: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
6b30: 2e 6e 20 3d 20 31 3b 0a 20 20 7a 20 3d 20 70 2d  .n = 1;.  z = p-
6b40: 3e 70 53 65 6c 65 63 74 2d 3e 7a 53 65 6c 65 63  >pSelect->zSelec
6b50: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
6b60: 70 28 7a 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  p(z, n);.  if( z
6b70: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
6b80: 20 28 28 69 6e 74 29 7a 29 20 2d 20 28 69 6e 74   ((int)z) - (int
6b90: 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 20 20  )pBegin->z;.    
6ba0: 73 71 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65  sqliteSelectMove
6bb0: 53 74 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65  Strings(p->pSele
6bc0: 63 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ct, offset);.   
6bd0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
6be0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
6bf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
6c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  .}../*.** The Ta
6c10: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
6c20: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
6c30: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
6c40: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
6c50: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
6c60: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
6c70: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
6c80: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
6c90: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
6ca0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
6cb0: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
6cc0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
6cd0: 20 70 50 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e   pPare->zErrMsg.
6ce0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 69  .*/.int sqliteVi
6cf0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
6d00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6d10: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
6d20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6d30: 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  st;.  Select *pS
6d40: 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  el;.  Table *pSe
6d50: 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72  lTab;.  int nErr
6d60: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6d70: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a   pTable );..  /*
6d80: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
6da0: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
6db0: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
6dc0: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
6dd0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
6de0: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
6df0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
6e00: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
6e10: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
6e20: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
6e30: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
6e40: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
6e50: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
6e60: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
6e70: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
6e80: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
6e90: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
6ea0: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
6eb0: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
6ec0: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
6ed0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
6ee0: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
6ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
6f00: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
6f10: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
6f20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
6f30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
6f40: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
6f50: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
6f60: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
6f70: 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61  sg, "view ", pTa
6f80: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
6f90: 20 20 20 20 20 22 20 69 73 20 63 69 72 63 75 6c       " is circul
6fa0: 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30  arly defined", 0
6fb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
6fc0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
6fd0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
6fe0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
6ff0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
7000: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
7010: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
7020: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
7030: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
7040: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
7050: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
7060: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
7070: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
7080: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
7090: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
70a0: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
70b0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
70c0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
70d0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
70e0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
70f0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
7100: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
7110: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
7120: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
7130: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
7140: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
7150: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
7160: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
7170: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
7180: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
7190: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
71a0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
71b0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
71c0: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
71d0: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
71e0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
71f0: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
7200: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
7210: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
7220: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
7230: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
7240: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
7250: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
7260: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
7270: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
7280: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
7290: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
72a0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
72b0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
72c0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
72d0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
72e0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
72f0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
7300: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
7310: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
7320: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
7330: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
7340: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
7350: 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
7360: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
7370: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
7380: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
7390: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
73a0: 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74  d(pSel);.  sqlit
73b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
73c0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSel->pEList);. 
73d0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
73e0: 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  pEList;.  return
73f0: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
7400: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
7410: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
7420: 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a  e VIEW pTable..*
7430: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7440: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
7450: 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74  ever any other t
7460: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
7470: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65  modified..** The
7480: 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74   view passed int
7490: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  o this routine m
74a0: 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65  ight depend dire
74b0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
74c0: 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64  ly.** on the mod
74d0: 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64  ified or deleted
74e0: 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65   table so we nee
74f0: 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f  d to clear the o
7500: 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d  ld column.** nam
7510: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  es so that they 
7520: 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74  will be recomput
7530: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7540: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
7550: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
7560: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
7570: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61  int i;.  if( pTa
7580: 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ble==0 || pTable
7590: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72  ->pSelect==0 ) r
75a0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61  eturn;.  if( pTa
75b0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72  ble->nCol==0 ) r
75c0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
75d0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
75e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
75f0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
7600: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
7610: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
7620: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  able->aCol[i].zD
7630: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
7640: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
7650: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d  l[i].zType);.  }
7660: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
7670: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  able->aCol);.  p
7680: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
7690: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
76a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
76b0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
76c0: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
76d0: 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VIEW..*/.void sq
76e0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
76f0: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
7700: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
7710: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
7720: 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69  SQLITE_UnresetVi
7730: 65 77 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ews)==0 ) return
7740: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
7750: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74  HashFirst(&db->t
7760: 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  blHash); i; i=sq
7770: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
7780: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
7790: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
77a0: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
77b0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
77c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77        sqliteView
77d0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
77e0: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
77f0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
7800: 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74   ~SQLITE_Unreset
7810: 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Views;.}../*.** 
7820: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c  Given a token, l
7830: 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77  ook up a table w
7840: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20  ith that name.  
7850: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65  If not found, le
7860: 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ave.** an error 
7870: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74  for the parser t
7880: 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72  o find and retur
7890: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65  n NULL..*/.Table
78a0: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f   *sqliteTableFro
78b0: 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  mToken(Parse *pP
78c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
78d0: 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  k){.  char *zNam
78e0: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
78f0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
7900: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
7910: 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66  oken(pTok);.  if
7920: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
7930: 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  urn 0;.  pTab = 
7940: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
7950: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
7960: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
7970: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
7980: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
7990: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
79a0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
79b0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
79c0: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
79d0: 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e  pTok->z, pTok->n
79e0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
79f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
7a00: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
7a10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7a20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
7a30: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
7a40: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
7a50: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
7a60: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
7a70: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
7a80: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
7a90: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
7aa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
7ab0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  oken *pName, int
7ac0: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
7ad0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62  e *pTable;.  Vdb
7ae0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
7af0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
7b00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
7b10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
7b20: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
7b30: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
7b40: 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  n;.  pTable = sq
7b50: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
7b60: 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  en(pParse, pName
7b70: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7b80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7b90: 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f  f( pTable->readO
7ba0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
7bb0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
7bc0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
7bd0: 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ble ", pTable->z
7be0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20  Name, .       " 
7bf0: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
7c00: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
7c10: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7c20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c30: 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
7c40: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ble->pSelect==0 
7c50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7c60: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7c70: 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52  zErrMsg, "use DR
7c80: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
7c90: 74 65 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20  te table ",.    
7ca0: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c    pTable->zName,
7cb0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7cc0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
7cd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
7ce0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65  isView && pTable
7cf0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
7d00: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
7d10: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
7d20: 67 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  g, "use DROP VIE
7d30: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
7d40: 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65   ",.      pTable
7d50: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
7d60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7d70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7d80: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
7d90: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
7da0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
7db0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
7dc0: 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
7dd0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
7de0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
7df0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
7e00: 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70  atic VdbeOp drop
7e10: 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  Table[] = {.    
7e20: 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65    { OP_OpenWrite
7e30: 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20  ,  0, 2,        
7e40: 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20  MASTER_NAME},.  
7e50: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
7e60: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
7e70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7e80: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
7e90: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7ea0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   2 */.      { OP
7eb0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
7ec0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
7ed0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
7ee0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
7ef0: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
7f00: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
7f10: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
7f20: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7f30: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
7f40: 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(8),  0},.  
7f50: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
7f60: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7f70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7f80: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
7f90: 41 44 44 52 28 34 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(4),  0}, /*
7fa0: 20 38 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   8 */.      { OP
7fb0: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30 2c 20  _Integer,    0, 
7fc0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7fd0: 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   9 */.      { OP
7fe0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  _SetCookie,  0, 
7ff0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
8000: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
8010: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
8020: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
8030: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8040: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
8050: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
8060: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
8070: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  able->isTemp ){.
8080: 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c        base = sql
8090: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
80a0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
80b0: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
80c0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
80d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
80e0: 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c 65  , base+2, pTable
80f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
8100: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
8110: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
8120: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
8130: 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78   base+9, db->nex
8140: 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  t_cookie);.    }
8150: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
8160: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8180: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
8190: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
81a0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  sTemp);.      fo
81b0: 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70  r(pIdx=pTable->p
81c0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
81d0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
81e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
81f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
8200: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
8210: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
8220: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
8230: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  }.    sqliteEndW
8240: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8250: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
8260: 20 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20   Move the table 
8270: 28 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64  (and all its ind
8280: 69 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e  ices) to the pen
8290: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e  ding DROP queue.
82a0: 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
82b0: 20 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72   table was never
82c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74   committed, just
82d0: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20   delete it.  If 
82e0: 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
82f0: 61 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  as been committe
8300: 64 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20  d and is placed 
8310: 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  on the pending D
8320: 52 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20  ROP queue, then 
8330: 74 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  the.  ** delete 
8340: 77 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20  will occur when 
8350: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
8360: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78  rnalChanges() ex
8370: 65 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ecutes..  **.  *
8380: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
8390: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
83a0: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
83b0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
83c0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
83d0: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
83e0: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
83f0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
8400: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
8410: 50 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65  PendingDropTable
8420: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
8430: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
8440: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
8450: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
8460: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
8470: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
8480: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
8490: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
84a0: 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20    pIndex is the 
84b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
84c0: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65  x .** and pTable
84d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
84e0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
84f0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
8500: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
8510: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
8520: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
8530: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
8540: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
8550: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
8560: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
8570: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
8580: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
8590: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
85a0: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
85b0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
85c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
85d0: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
85e0: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
85f0: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8600: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
8610: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
8620: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
8630: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
8640: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
8650: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
8660: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
8670: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
8680: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
8690: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
86a0: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
86b0: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
86c0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
86d0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
86e0: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
86f0: 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a  iteCreateIndex(.
8700: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8710: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
8720: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
8730: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
8740: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
8750: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
8760: 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  x.  May be NULL 
8770: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
8780: 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  le,   /* Name of
8790: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e   the table to in
87a0: 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65  dex.  Use pParse
87b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
87c0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c   */.  IdList *pL
87d0: 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
87e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
87f0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
8800: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
8810: 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
8820: 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
8830: 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
8840: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
8850: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
8860: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
8870: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
8880: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
8890: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
88a0: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
88b0: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
88c0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
88d0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
88e0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
88f0: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
8900: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
8910: 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54   *pIndex;   /* T
8920: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
8930: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
8940: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
8950: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
8960: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
8970: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
8980: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
8990: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c  ID list */.  sql
89a0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
89b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65  ->db;.  int hide
89c0: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
89d0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20    /* Do not put 
89e0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
89f0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
8a00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8a10: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
8a20: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
8a30: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
8a40: 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
8a50: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
8a60: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
8a70: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
8a80: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
8a90: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
8aa0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61  able!=0 ){.    a
8ab0: 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20  ssert( pName!=0 
8ac0: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73  );.    pTab =  s
8ad0: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
8ae0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ken(pParse, pTab
8af0: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
8b00: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
8b10: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
8b20: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
8b30: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
8b40: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
8b50: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
8b60: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
8b70: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
8b80: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
8b90: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
8ba0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8bb0: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
8bc0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
8bd0: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20  ay not have new 
8be0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
8bf0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
8c00: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
8c10: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
8c20: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
8c30: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
8c40: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8c50: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8c60: 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20  Msg, "views may 
8c70: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
8c80: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
8c90: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
8ca0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
8cb0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
8cc0: 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
8cd0: 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65  created while re
8ce0: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68  -reading the sch
8cf0: 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ema from sqlite_
8d00: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20  master.  ** but 
8d10: 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  the table associ
8d20: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8d30: 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72  ndex is a tempor
8d40: 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61  ary table, it ca
8d50: 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e  n.  ** only mean
8d60: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
8d70: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8d80: 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69  is really associ
8d90: 61 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a  ated with is.  *
8da0: 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65  * one whose name
8db0: 20 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e   is hidden behin
8dc0: 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  d a temporary ta
8dd0: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
8de0: 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e  e name..  ** Sin
8df0: 63 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73  ce its table has
8e00: 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64   been suppressed
8e10: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73  , we need to als
8e20: 6f 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20  o suppress the. 
8e30: 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   ** index..  */.
8e40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
8e50: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d 3e  itFlag && pTab->
8e60: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f  isTemp ){.    go
8e70: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
8e80: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
8e90: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
8ea0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
8eb0: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
8ec0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
8ed0: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
8ee0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
8ef0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
8f00: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
8f10: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
8f20: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
8f30: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
8f40: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
8f50: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
8f60: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
8f70: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
8f80: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
8f90: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
8fa0: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
8fb0: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
8fc0: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
8fd0: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
8fe0: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
8ff0: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
9000: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
9010: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
9020: 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20  ex, but we will 
9030: 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69  not.  ** store i
9040: 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68  ts name in the h
9050: 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20  ash table.  Set 
9060: 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61  the hideName fla
9070: 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a  g to accomplish.
9080: 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a    ** this..  **.
9090: 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
90a0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
90b0: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
90c0: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
90d0: 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
90e0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
90f0: 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
9100: 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
9110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
9120: 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  me ){.    Index 
9130: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
9140: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
9150: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
9160: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
9170: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
9180: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
9190: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
91a0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
91b0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
91c0: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
91d0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
91e0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
91f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9200: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
9210: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
9220: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
9230: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
9240: 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d   if( pISameName-
9250: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
9260: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
9270: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
9280: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
9290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
92b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
92c0: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
92d0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
92e0: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
92f0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  s", 0);.        
9300: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9310: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
9320: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9340: 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d    if( (pTSameNam
9350: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
9360: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  ble(db, zName))!
9370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9380: 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65  pTSameName->isTe
9390: 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  mp && pParse->in
93a0: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  itFlag ){.      
93b0: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a    hideName = 1;.
93c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
93d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
93e0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
93f0: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
9400: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
9410: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
9420: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
9430: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9440: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
9450: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9460: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
9470: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9480: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
9490: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
94a0: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
94b0: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
94c0: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
94d0: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
94e0: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
94f0: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
9500: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
9510: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
9520: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9530: 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61  &zName, "(", pTa
9540: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f  b->zName, " auto
9550: 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30  index ", zBuf, 0
9560: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
9570: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
9580: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9590: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c    hideName = sql
95a0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
95b0: 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a   zName)!=0;.  }.
95c0: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
95d0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
95e0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
95f0: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
9600: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
9610: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
9620: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
9630: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
9640: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
9650: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
9660: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
9670: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
9680: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
9690: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
96a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
96b0: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
96c0: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
96d0: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
96e0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
96f0: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
9700: 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
9710: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
9720: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9730: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
9740: 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
9750: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
9760: 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
9770: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
9780: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
9790: 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
97a0: 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69   sizeof(int)*pLi
97d0: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
97e0: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
97f0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9800: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
9810: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
9820: 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49  &pIndex[1];.  pI
9830: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
9840: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
9850: 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49  Column[pList->nI
9860: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
9870: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
9880: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
9890: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
98a0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
98b0: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70   pList->nId;.  p
98c0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
98d0: 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75   pIndex->isUniqu
98e0: 65 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20  e = onError;..  
98f0: 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
9900: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
9910: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
9920: 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
9930: 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
9940: 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
9950: 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
9960: 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
9970: 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
9980: 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
9990: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
99a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
99b0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
99c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
99d0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
99e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
99f0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9a00: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9a10: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
9a20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9a30: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
9a40: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
9a50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
9a60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
9a70: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
9a80: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
9a90: 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e   " has no column
9aa0: 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d   named ", pList-
9ab0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
9ac0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9ad0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
9ae0: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
9af0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
9b00: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
9b10: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
9b20: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
9b30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
9b40: 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
9b50: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
9b60: 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
9b70: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
9b80: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
9b90: 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
9ba0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
9bb0: 65 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65  explain && !hide
9bc0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65  Name ){.    Inde
9bd0: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
9be0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
9bf0: 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e  db->idxHash, pIn
9c00: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
9c10: 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  en(zName)+1, pIn
9c20: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
9c30: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9c40: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
9c50: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
9c60: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
9c70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
9c80: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
9c90: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9ca0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
9cb0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
9cc0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
9cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
9ce0: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
9cf0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
9d00: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
9d10: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
9d20: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
9d30: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
9d40: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
9d50: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
9d60: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
9d70: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
9d80: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
9d90: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
9da0: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
9db0: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
9dc0: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
9dd0: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
9de0: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
9df0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
9e00: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
9e10: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
9e20: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
9e30: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
9e40: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
9e50: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
9e60: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
9e70: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
9e80: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
9e90: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
9ea0: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
9eb0: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
9ec0: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
9ed0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
9ee0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
9ef0: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
9f00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
9f10: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
9f20: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
9f30: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
9f40: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
9f50: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9f60: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
9f70: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
9f80: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
9f90: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
9fa0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
9fb0: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
9fc0: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
9fd0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
9fe0: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
9ff0: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
a000: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
a010: 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20  ag && pTable!=0 
a020: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
a030: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
a040: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
a050: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
a060: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
a070: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
a080: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
a090: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
a0a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
a0b0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a0c0: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
a0d0: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
a0e0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
a0f0: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
a100: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e    **.  ** The in
a110: 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e  itFlag is 0 when
a120: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
a130: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
a140: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
a150: 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c  and.  The initFl
a160: 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  ag is 1 when a d
a170: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
a180: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
a190: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
a1a0: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
a1b0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
a1c0: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
a1d0: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
a1e0: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
a1f0: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
a200: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
a210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
a220: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
a230: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
a240: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
a250: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
a260: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
a270: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
a280: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
a290: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
a2a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a2b0: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
a2c0: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
a2d0: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
a2e0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
a2f0: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
a300: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
a310: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
a320: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
a330: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
a340: 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a  >initFlag==0 ){.
a350: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
a360: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
a370: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
a380: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
a390: 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 54  ddr;.    int isT
a3a0: 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  emp = pTab->isTe
a3b0: 6d 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  mp;..    v = sql
a3c0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
a3d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
a3e0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
a3f0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
a400: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
a410: 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
a420: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
a430: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
a440: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
a450: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a460: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
a470: 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20  Write, 0, 2);.  
a480: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a490: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
a4a0: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f  MASTER_NAME, P3_
a4b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
a4c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
a4d0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
a4e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a4f0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
a500: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a510: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a520: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
a530: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a540: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a550: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
a560: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
a570: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a580: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
a590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a5a0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a5b0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
a5c0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a5e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
a5f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a600: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a610: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
a620: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
a630: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
a640: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
a650: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
a660: 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  dex, 0, isTemp);
a670: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
a680: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
a690: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
a6a0: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
a6b0: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
a6c0: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
a6d0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
a6e0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
a6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a700: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a710: 65 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a  enWrAux, 1, 0);.
a720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a730: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a740: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a750: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
a760: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a770: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
a780: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
a790: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
a7a0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64  Temp ){.      ad
a7b0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
a7c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a7d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
a7e0: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
a7f0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  nd ){.        n 
a800: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
a810: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
a820: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73  ) + 1;.        s
a830: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
a840: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
a850: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t->z, n);.      
a860: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
a870: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
a880: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
a890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
a8a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
a8b0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
a8c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
a8d0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
a8e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a8f0: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
a900: 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32  Aux : OP_Open, 2
a910: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
a920: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a930: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
a940: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
a950: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62  TATIC);.      lb
a960: 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l2 = sqliteVdbeM
a970: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a980: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a990: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
a9a0: 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
a9b0: 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
a9c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
a9d0: 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cno, 2, 0);.    
a9e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
a9f0: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
aa00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
aa10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
aa20: 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e  P_Column, 2, pIn
aa30: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
aa40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
aa50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
aa60: 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  (v, OP_MakeIdxKe
aa70: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  y, pIndex->nColu
aa80: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mn, 0);.      sq
aa90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aaa0: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
aab0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
aac0: 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20  OE_None);.      
aad0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aae0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
aaf0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
ab00: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
ab10: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
ab20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ab30: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ab40: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
ab50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ab60: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
ab70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ab80: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
ab90: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
aba0: 0a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 43  .        changeC
abb0: 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20  ookie(db);.     
abc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
abd0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
abe0: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
abf0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
ac00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ac10: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
ac20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
ac30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ac40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
ac50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ac60: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
ac70: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
ac80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ac90: 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
aca0: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
acb0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
acc0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
acd0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
ace0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
acf0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ad00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ad10: 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
ad20: 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
ad30: 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
ad40: 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
ad50: 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
ad60: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
ad70: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64  id sqliteDropInd
ad80: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
ad90: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
ada0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
adb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
adc0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
add0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
ade0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
adf0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
ae00: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
ae10: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  ed ) return;.  z
ae20: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
ae30: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
ae40: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
ae50: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
ae60: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
ae70: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
ae80: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
ae90: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
aea0: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
aeb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
aec0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
aed0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
aee0: 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20  index: ", 0, .  
aef0: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20        pName->z, 
af00: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
af10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
af20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
af30: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
af40: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
af50: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
af60: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
af70: 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
af80: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
af90: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
afa0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
afb0: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
afc0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
afd0: 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20  Write,  0, 2,   
afe0: 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d      MASTER_NAME}
aff0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  ,.      { OP_Rew
b000: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
b010: 28 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20 20 20  (10),0}, .      
b020: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
b030: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b040: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 2 */.      {
b050: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
b060: 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  1, 1,       0},.
b070: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
b080: 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
b090: 20 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20     0}, /* 4 */. 
b0a0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b0b0: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
b0c0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
b0d0: 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
b0e0: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
b0f0: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
b100: 20 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20      0, ADDR(4), 
b110: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
b120: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
b130: 44 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20 20 20  DR(10),0},.     
b140: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
b150: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
b160: 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20  , /* 9 */.      
b170: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
b180: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b190: 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20   /* 10 */.      
b1a0: 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  { OP_SetCookie, 
b1b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b1c0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
b1d0: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20  e,      0, 0,   
b1e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
b1f0: 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20     int base;.   
b200: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
b210: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a  Index->pTable;..
b220: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
b230: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
b240: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  arse);.    if( !
b250: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  pTab->isTemp ){.
b260: 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c        base = sql
b270: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
b280: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
b290: 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e  opIndex), dropIn
b2a0: 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dex);.      sqli
b2b0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b2c0: 2c 20 62 61 73 65 2b 32 2c 20 70 49 6e 64 65 78  , base+2, pIndex
b2d0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
b2e0: 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  IC);.      chang
b2f0: 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20  eCookie(db);.   
b300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b310: 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 31 30  ngeP1(v, base+10
b320: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
b330: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
b340: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b350: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e   OP_Destroy, pIn
b360: 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  dex->tnum, pTab-
b370: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  >isTemp);.    sq
b380: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
b390: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
b3a0: 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68   }..  /* Move th
b3b0: 65 20 69 6e 64 65 78 20 6f 6e 74 6f 20 74 68 65  e index onto the
b3c0: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75   pending DROP qu
b3d0: 65 75 65 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  eue.  Or, if the
b3e0: 20 69 6e 64 65 78 20 77 61 73 0a 20 20 2a 2a 20   index was.  ** 
b3f0: 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65 64 2c  never committed,
b400: 20 6a 75 73 74 20 64 65 6c 65 74 65 20 69 74 2e   just delete it.
b410: 20 20 49 6e 64 69 63 65 73 20 6f 6e 20 74 68 65    Indices on the
b420: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75   pending DROP qu
b430: 65 75 65 0a 20 20 2a 2a 20 67 65 74 20 64 65 6c  eue.  ** get del
b440: 65 74 65 64 20 62 79 20 73 71 6c 69 74 65 43 6f  eted by sqliteCo
b450: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
b460: 67 65 73 28 29 20 77 68 65 6e 20 74 68 65 20 75  ges() when the u
b470: 73 65 72 20 65 78 65 63 75 74 65 73 0a 20 20 2a  ser executes.  *
b480: 2a 20 61 20 43 4f 4d 4d 49 54 2e 20 20 4f 72 20  * a COMMIT.  Or 
b490: 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
b4a0: 63 75 72 73 2c 20 74 68 65 20 65 6c 65 6d 65 6e  curs, the elemen
b4b0: 74 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20 71  ts of the DROP q
b4c0: 75 65 75 65 0a 20 20 2a 2a 20 61 72 65 20 6d 6f  ueue.  ** are mo
b4d0: 76 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ved back into th
b4e0: 65 20 6d 61 69 6e 20 68 61 73 68 20 74 61 62 6c  e main hash tabl
b4f0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
b500: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
b510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 50 65 6e 64  {.    sqlitePend
b520: 69 6e 67 44 72 6f 70 49 6e 64 65 78 28 64 62 2c  ingDropIndex(db,
b530: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
b540: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b550: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
b570: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
b580: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
b590: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
b5a0: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
b5b0: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
b5c0: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
b5d0: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
b5e0: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
b5f0: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
b600: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
b610: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
b620: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
b630: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
b640: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
b650: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
b660: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
b670: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
b680: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b690: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
b6a0: 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a  >nId & 7)==0 ){.
b6b0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
b6c0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
b6d0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
b6e0: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
b6f0: 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66  t->nId+8)*sizeof
b700: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
b710: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
b720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
b730: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
b740: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
b750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
b760: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
b770: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
b780: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c  [pList->nId], 0,
b790: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
b7a0: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
b7b0: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
b7c0: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
b7d0: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
b7e0: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
b7f0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f  tNString(pz, pTo
b800: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
b810: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
b820: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
b830: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b840: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
b850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
b860: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b870: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
b880: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
b890: 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
b8a0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
b8b0: 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
b8c0: 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
b8d0: 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
b8e0: 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
b8f0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
b900: 74 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73  teIdListAddAlias
b910: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
b920: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
b930: 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
b940: 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20  List->nId>0 ){. 
b950: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
b960: 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73  ->nId - 1;.    s
b970: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
b980: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
b990: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
b9a0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
b9b0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
b9c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
b9d0: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
b9e0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
b9f0: 69 72 65 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76  ire IdList..*/.v
ba00: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
ba10: 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
ba20: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
ba30: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ba40: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
ba50: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
ba60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
ba70: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
ba80: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
ba90: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
baa0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  >a[i].zAlias);. 
bab0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
bac0: 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74  i].pTab && pList
bad0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54  ->a[i].pTab->isT
bae0: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
baf0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
bb00: 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b  ble(0, pList->a[
bb10: 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  i].pTab);.    }.
bb20: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
bb30: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
bb40: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  i].pSelect);.  }
bb50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
bb60: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
bb70: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
bb80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20  ./*.** The COPY 
bb90: 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63  command is for c
bba0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
bbb0: 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64  h PostgreSQL and
bbc0: 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a   specificially.*
bbd0: 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74  * for the abilit
bbe0: 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  y to read the ou
bbf0: 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e  tput of pg_dump.
bc00: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20    The format is 
bc10: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  as.** follows:.*
bc20: 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62  *.**    COPY tab
bc30: 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53  le FROM file [US
bc40: 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73  ING DELIMITERS s
bc50: 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61  tring].**.** "ta
bc60: 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74  ble" is an exist
bc70: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ing table name. 
bc80: 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69   We will read li
bc90: 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d  nes of code from
bca0: 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c  .** file to fill
bcb0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68   this table with
bcc0: 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67   data.  File mig
bcd0: 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20  ht be "stdin".  
bce0: 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20  The optional.** 
bcf0: 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67  delimiter string
bd00: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
bd10: 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73  field separators
bd20: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
bd30: 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64  s a tab..*/.void
bd40: 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50   sqliteCopy(.  P
bd50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bd60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
bd70: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
bd80: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
bd90: 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20  ,   /* The name 
bda0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
bdb0: 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  o which we will 
bdc0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65  insert */.  Toke
bdd0: 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20  n *pFilename,   
bde0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
bdf0: 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69  m which to obtai
be00: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  n information */
be10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d  .  Token *pDelim
be20: 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20 74  iter,   /* Use t
be30: 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64  his as the field
be40: 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20 20   delimiter */.  
be50: 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20 20  int onError     
be60: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
be70: 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61 69  do if a constrai
be80: 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20  nt fails */.){. 
be90: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
bea0: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e  char *zTab;.  in
beb0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  t i;.  Vdbe *v;.
bec0: 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b    int addr, end;
bed0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
bee0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
bef0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54  Parse->db;..  zT
bf00: 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  ab = sqliteTable
bf10: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
bf20: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ableName);.  if(
bf30: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
bf40: 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30  ailed || zTab==0
bf50: 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65   ) goto copy_cle
bf60: 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20 73  anup;.  pTab = s
bf70: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f  qliteTableNameTo
bf80: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a 54  Table(pParse, zT
bf90: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ab);.  sqliteFre
bfa0: 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 70  e(zTab);.  if( p
bfb0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f  Tab==0 ) goto co
bfc0: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 76 20  py_cleanup;.  v 
bfd0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
bfe0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
bff0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e   ){.    int open
c000: 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65  Op;.    sqliteBe
c010: 67 69 6e 4d 75 6c 74 69 57 72 69 74 65 4f 70 65  ginMultiWriteOpe
c020: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
c030: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c040: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c050: 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29  _FileOpen, 0, 0)
c060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c070: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
c080: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20  , pFilename->z, 
c090: 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20  pFilename->n);. 
c0a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
c0b0: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
c0c0: 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54  .    openOp = pT
c0d0: 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f  ab->isTemp ? OP_
c0e0: 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f  OpenWrAux : OP_O
c0f0: 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71  penWrite;.    sq
c100: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c110: 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62   openOp, 0, pTab
c120: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
c130: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c140: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
c150: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
c160: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
c170: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c180: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c190: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
c1a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c1b0: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69  dOp(v, openOp, i
c1c0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
c1d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
c1e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
c1f0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
c200: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
c210: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
c220: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
c230: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
c240: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c250: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
c260: 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
c270: 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a   the row count *
c280: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20  /.    }.    end 
c290: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
c2a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64  Label(v);.    ad
c2b0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
c2c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52  ddOp(v, OP_FileR
c2d0: 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ead, pTab->nCol,
c2e0: 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70   end);.    if( p
c2f0: 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20  Delimiter ){.   
c300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c310: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
c320: 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44  Delimiter->z, pD
c330: 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20  elimiter->n);.  
c340: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
c350: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
c360: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c370: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c380: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22  ngeP3(v, addr, "
c390: 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  \t", 1);.    }. 
c3a0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b     if( pTab->iPK
c3b0: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ey>=0 ){.      s
c3c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c3d0: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
c3e0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29   pTab->iPKey, 0)
c3f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
c400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
c410: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
c420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c430: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c440: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
c450: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
c460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
c470: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
c480: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
c490: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
c4a0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
c4b0: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  r primary key co
c4c0: 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77  lumn is filled w
c4d0: 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69  ith NULL since i
c4e0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  ts.        ** va
c4f0: 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75  lue is always pu
c500: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  lled from the re
c510: 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  cord number */. 
c520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
c530: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
c540: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
c550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c560: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c570: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
c580: 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, i, 0);.      
c590: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c5a0: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
c5b0: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
c5c0: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30  e, pTab, 0, 0, 0
c5d0: 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64  , 0, onError, ad
c5e0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  dr);.    sqliteC
c5f0: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
c600: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
c610: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
c620: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
c630: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
c640: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)!=0 ){.      s
c650: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c660: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
c670: 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  0);  /* Incremen
c680: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
c690: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
c6a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
c6b0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
c6c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
c6d0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
c6e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
c6f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
c700: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
c710: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
c720: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
c730: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
c740: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
c750: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
c760: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c770: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
c780: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
c790: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c7a0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30  OP_ColumnName, 0
c7b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c7c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
c7d0: 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65  , -1, "rows inse
c7e0: 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43  rted", P3_STATIC
c7f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
c810: 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a  allback, 1, 0);.
c820: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70      }.  }.  .cop
c830: 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74  y_cleanup:.  ret
c840: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
c850: 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56  e non-standard V
c860: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73  ACUUM command is
c870: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
c880: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  p the database,.
c890: 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65  ** collapse free
c8a0: 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74   space, etc.  It
c8b0: 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74   is modelled aft
c8c0: 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f  er the VACUUM co
c8d0: 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74  mmand.** in Post
c8e0: 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e  greSQL..**.** In
c8f0: 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20 6f   version 1.0.x o
c900: 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56 41  f SQLite, the VA
c910: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f 75  CUUM command wou
c920: 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d 5f  ld call.** gdbm_
c930: 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e 20  reorganize() on 
c940: 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  all the database
c950: 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62 65   tables.  But be
c960: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
c970: 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e 6f  2.0.0, SQLite no
c980: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44 42   longer uses GDB
c990: 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e  M so this comman
c9a0: 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65 20  d has.** become 
c9b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64  a no-op..*/.void
c9c0: 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61   sqliteVacuum(Pa
c9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
c9e0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b  en *pTableName){
c9f0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
ca00: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   */.}../*.** Beg
ca10: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
ca20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
ca30: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
ca40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ca50: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
ca60: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
ca70: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
ca80: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
ca90: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
caa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
cab0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
cac0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
cad0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
cae0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
caf0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
cb00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
cb10: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
cb20: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
cb30: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
cb40: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
cb50: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  db->onError = on
cb60: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
cb70: 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
cb80: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
cb90: 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  iteCommitTransac
cba0: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
cbb0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
cbc0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
cbd0: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
cbe0: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
cbf0: 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  >pBe==0 ) return
cc00: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
cc10: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
cc20: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
cc30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
cc40: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
cc50: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72  _InTrans)==0 ) r
cc60: 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61  eturn;.  db->fla
cc70: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
cc80: 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45  Trans;.  sqliteE
cc90: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
cca0: 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e  (pParse);.  db->
ccb0: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
ccc0: 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ault;.}../*.** R
ccd0: 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
cce0: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
ccf0: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  liteRollbackTran
cd00: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
cd10: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
cd20: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
cd30: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
cd40: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
cd50: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  >db)==0 || db->p
cd60: 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Be==0 ) return;.
cd70: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
cd80: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
cd90: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
cda0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
cdb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
cdc0: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74  nTrans)==0 ) ret
cdd0: 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  urn;.  v = sqlit
cde0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
cdf0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
ce00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ce10: 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c  (v, OP_Rollback,
ce20: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62   0, 0);.  }.  db
ce30: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ce40: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62  TE_InTrans;.  db
ce50: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44  ->onError = OE_D
ce60: 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  efault;.}../*.**
ce70: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
ce80: 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
ce90: 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
cea0: 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
ceb0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
cec0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
ced0: 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
cee0: 62 65 20 61 74 6f 6d 69 63 20 69 6e 20 74 68 65  be atomic in the
cef0: 0a 2a 2a 20 73 65 6e 73 65 20 74 68 61 74 20 69  .** sense that i
cf00: 74 20 77 69 6c 6c 20 65 69 74 68 65 72 20 64 6f  t will either do
cf10: 20 69 74 73 20 63 68 61 6e 67 65 73 20 63 6f 6d   its changes com
cf20: 70 6c 65 74 65 6c 79 20 6f 72 20 6e 6f 74 20 61  pletely or not a
cf30: 74 0a 2a 2a 20 61 6c 6c 2e 20 20 53 6f 20 74 68  t.** all.  So th
cf40: 65 72 65 20 69 73 20 6e 6f 74 20 6e 65 65 64 20  ere is not need 
cf50: 74 6f 20 73 65 74 20 61 20 63 68 65 63 6b 70 6f  to set a checkpo
cf60: 69 6e 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  int is a transac
cf70: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 6c 72 65 61  tion.** is alrea
cf80: 64 79 20 69 6e 20 65 66 66 65 63 74 2e 0a 2a 2f  dy in effect..*/
cf90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69  .void sqliteBegi
cfa0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
cfb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
cfc0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d    Vdbe *v;.  v =
cfd0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
cfe0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
cff0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
d000: 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
d010: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
d020: 6e 54 72 61 6e 73 29 3d 3d 30 20 20 29 7b 0a 20  nTrans)==0  ){. 
d030: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d040: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
d050: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
d060: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d070: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
d080: 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d  kie, pParse->db-
d090: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20  >schema_cookie, 
d0a0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
d0b0: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
d0c0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
d0d0: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
d0e0: 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
d0f0: 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
d100: 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
d110: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
d120: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
d130: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69 67 68 74   operation might
d140: 20 6e 6f 74 20 62 65 20 61 74 6f 6d 69 63 20 69   not be atomic i
d150: 6e 0a 2a 2a 20 74 68 65 20 73 65 6e 73 65 20 74  n.** the sense t
d160: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6d 61 79  hat an error may
d170: 20 62 65 20 64 69 73 63 6f 76 65 72 65 64 20 61   be discovered a
d180: 6e 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  nd the operation
d190: 20 6d 69 67 68 74 0a 2a 2a 20 61 62 6f 72 74 20   might.** abort 
d1a0: 61 66 74 65 72 20 73 6f 6d 65 20 63 68 61 6e 67  after some chang
d1b0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
d1c0: 65 2e 20 20 49 66 20 77 65 20 61 72 65 20 69 6e  e.  If we are in
d1d0: 20 74 68 65 20 6d 69 64 64 6c 65 20 0a 2a 2a 20   the middle .** 
d1e0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
d1f0: 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 74 73  , then this sets
d200: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 20   a checkpoint.  
d210: 49 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  If we are not in
d220: 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
d230: 6e 2c 20 74 68 65 6e 20 73 74 61 72 74 20 61 20  n, then start a 
d240: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
d250: 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e  void sqliteBegin
d260: 4d 75 6c 74 69 57 72 69 74 65 4f 70 65 72 61 74  MultiWriteOperat
d270: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d280: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  e){.  Vdbe *v;. 
d290: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
d2a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
d2b0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
d2c0: 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
d2d0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d2e0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
d2f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
d300: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
d310: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
d320: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d330: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
d340: 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e  Cookie, pParse->
d350: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
d360: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
d370: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
d380: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
d390: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d3a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  dOp(v, OP_Checkp
d3b0: 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  oint, 0, 0);.  }
d3c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
d3d0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
d3e0: 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
d3f0: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
d400: 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
d410: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d420: 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20   is a companion 
d430: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69  function to Begi
d440: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
d450: 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  )..** If a trans
d460: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
d470: 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ed, then commit 
d480: 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70  it.  If a checkp
d490: 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72  oint was.** star
d4a0: 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ted then commit 
d4b0: 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  that..*/.void sq
d4c0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
d4d0: 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
d4e0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
d4f0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
d500: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d510: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
d520: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
d530: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
d540: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
d550: 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67     /* Do Nothing
d560: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
d570: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d580: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
d590: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , 0);.  }.}.../*
d5a0: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
d5b0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
d5c0: 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
d5d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d5e0: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72   getBoolean(char
d5f0: 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *z){.  static c
d600: 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20  har *azTrue[] = 
d610: 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22  { "yes", "on", "
d620: 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69  true" };.  int i
d630: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20  ;.  if( z[0]==0 
d640: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d650: 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20  ( isdigit(z[0]) 
d660: 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  || (z[0]=='-' &&
d670: 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20   isdigit(z[1])) 
d680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74  ){.    return at
d690: 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  oi(z);.  }.  for
d6a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
d6b0: 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a  zTrue)/sizeof(az
d6c0: 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  True[0]); i++){.
d6d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
d6e0: 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69  rICmp(z,azTrue[i
d6f0: 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
d700: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
d720: 73 73 20 61 20 70 72 61 67 6d 61 20 73 74 61 74  ss a pragma stat
d730: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50  ement.  .**.** P
d740: 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68  ragmas are of th
d750: 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  is form:.**.**  
d760: 20 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d 20      PRAGMA id = 
d770: 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  value.**.** The 
d780: 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74  identifier might
d790: 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e   also be a strin
d7a0: 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  g.  The value is
d7b0: 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a   a string, and.*
d7c0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72  * identifier, or
d7d0: 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d   a number.  If m
d7e0: 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65  inusFlag is true
d7f0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
d800: 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20   is.** a number 
d810: 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65  that was precede
d820: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
d830: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
d840: 65 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70  ePragma(Parse *p
d850: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c  Parse, Token *pL
d860: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
d870: 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61  ht, int minusFla
d880: 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66  g){.  char *zLef
d890: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
d8a0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Right = 0;.  sql
d8b0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
d8c0: 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d  ->db;..  zLeft =
d8d0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
d8e0: 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e  Left->z, pLeft->
d8f0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
d900: 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66  ote(zLeft);.  if
d910: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
d920: 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20     zRight = 0;. 
d930: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
d940: 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22  ing(&zRight, "-"
d950: 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20  , 1, pRight->z, 
d960: 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20  pRight->n, 0);. 
d970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67   }else{.    zRig
d980: 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ht = sqliteStrND
d990: 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52  up(pRight->z, pR
d9a0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  ight->n);.    sq
d9b0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67  liteDequote(zRig
d9c0: 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 69 66 28  ht);.  }. .  if(
d9d0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
d9e0: 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69 7a 65  Left,"cache_size
d9f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
da00: 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61  tic VdbeOp getCa
da10: 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
da20: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
da30: 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20  kie,  0, 2,     
da40: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
da50: 50 5f 41 62 73 56 61 6c 75 65 2c 20 20 20 20 30  P_AbsValue,    0
da60: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
da70: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
da80: 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
da90: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
daa0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
dab0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
dac0: 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
dad0: 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
dae0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
daf0: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
db00: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
db10: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
db20: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
db30: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
db40: 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
db50: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  t->z ){.      sq
db60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
db70: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
db80: 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65  etCacheSize), ge
db90: 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20  tCacheSize);.   
dba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
dbb0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  t addr;.      in
dbc0: 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52  t size = atoi(zR
dbd0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
dbe0: 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d   size<0 ) size =
dbf0: 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71   -size;.      sq
dc00: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
dc10: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
dc20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
dc30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
dc40: 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
dc50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
dc60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
dc70: 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
dc80: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
dc90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dca0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
dcb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
dcc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65  beAddOp(v, OP_Ge
dcd0: 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  , 0, addr+3);.  
dce0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dcf0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69  dOp(v, OP_Negati
dd00: 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ve, 0, 0);.     
dd10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
dd20: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
dd30: 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , 0, 2);.      s
dd40: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
dd50: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
dd60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
dd70: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
dd80: 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68 72  mp(zLeft,"synchr
dd90: 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20  onous")==0 ){.  
dda0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
ddb0: 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20  getSync[] = {.  
ddc0: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
ddd0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
dde0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
ddf0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30  P_ReadCookie,  0
de00: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
de10: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
de20: 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  er,     0, 0,   
de30: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
de40: 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20 20   OP_Lt,         
de50: 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30 7d   0, 5,        0}
de60: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64  ,.      { OP_Add
de70: 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20  Imm,      1, 0, 
de80: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
de90: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
dea0: 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
deb0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
dec0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
ded0: 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72  ,        "synchr
dee0: 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b  onous"},.      {
def0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
df00: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
df10: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
df20: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
df30: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
df40: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
df50: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69  urn;.    if( pRi
df60: 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
df70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
df80: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
df90: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79   ArraySize(getSy
dfa0: 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20  nc), getSync);. 
dfb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dfc0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
dfd0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
dfe0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
dff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
e000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
e010: 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29  eadCookie, 0, 2)
e020: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
e030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62  beAddOp(v, OP_Ab
e040: 73 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20  sValue, 0, 0);. 
e050: 20 20 20 20 20 69 66 28 20 21 67 65 74 42 6f 6f       if( !getBoo
e060: 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
e070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
e080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
e090: 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20  gative, 0, 0);. 
e0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e0b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e0c0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
e0d0: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
e0e0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
e0f0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
e100: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
e110: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
e120: 4c 65 66 74 2c 20 22 76 64 62 65 5f 74 72 61 63  Left, "vdbe_trac
e130: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  e")==0 ){.    if
e140: 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
e150: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
e160: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
e170: 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20  E_VdbeTrace;.   
e180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
e190: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
e1a0: 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20  TE_VdbeTrace;.  
e1b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
e1c0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
e1d0: 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c 5f 63 6f  (zLeft, "full_co
e1e0: 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30 20  lumn_names")==0 
e1f0: 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
e200: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
e210: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
e220: 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43   |= SQLITE_FullC
e230: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 65 6c  olNames;.    }el
e240: 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
e250: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46  ags &= ~SQLITE_F
e260: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20  ullColNames;.   
e270: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
e280: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
e290: 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73  zLeft, "result_s
e2a0: 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20  et_details")==0 
e2b0: 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
e2c0: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
e2d0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
e2e0: 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c   |= SQLITE_Resul
e2f0: 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65  tDetails;.    }e
e300: 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
e310: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
e320: 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20  ResultDetails;. 
e330: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
e340: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
e350: 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f  p(zLeft, "count_
e360: 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a  changes")==0 ){.
e370: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
e380: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
e390: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
e3a0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
e3b0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
e3c0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
e3d0: 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f   ~SQLITE_CountRo
e3e0: 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ws;.    }.  }els
e3f0: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
e400: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65  trICmp(zLeft, "e
e410: 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c  mpty_result_call
e420: 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20  backs")==0 ){.  
e430: 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
e440: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
e450: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
e460: 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
e470: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
e480: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
e490: 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61  = ~SQLITE_NullCa
e4a0: 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  llback;.    }.  
e4b0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
e4c0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
e4d0: 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d  , "table_info")=
e4e0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
e4f0: 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
e500: 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
e510: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
e520: 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
e530: 69 66 28 20 70 54 61 62 20 29 20 76 20 3d 20 73  if( pTab ) v = s
e540: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
e550: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rse);.    if( pT
e560: 61 62 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  ab && v ){.     
e570: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
e580: 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
e590: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
e5a0: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
e5b0: 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  5, 0,       0},.
e5c0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
e5d0: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
e5e0: 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
e5f0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
e600: 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
e610: 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
e620: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
e630: 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
e640: 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20     "type"},.    
e650: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
e660: 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20  ame,  3, 0,     
e670: 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20    "notnull"},.  
e680: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
e690: 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20  nName,  4, 0,   
e6a0: 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22      "dflt_value"
e6b0: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
e6c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
e6d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
e6e0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
e6f0: 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
e700: 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ), tableInfoPref
e710: 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
e720: 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
e730: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
e740: 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
e750: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
e760: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
e770: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e780: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
e790: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
e7a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e7b0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
e7c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e7d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e7e0: 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
e7f0: 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ].zName, P3_STAT
e800: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
e810: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e820: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
e830: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e840: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e850: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
e860: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  pTab->aCol[i].zT
e870: 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  ype ? pTab->aCol
e880: 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78  [i].zType : "tex
e890: 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  t", P3_STATIC);.
e8a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
e8b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
e8c0: 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f  teger, pTab->aCo
e8d0: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29  l[i].notNull, 0)
e8e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e8f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e900: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
e910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
e920: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
e930: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
e940: 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29  Dflt, P3_STATIC)
e950: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e960: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e970: 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b  Callback, 5, 0);
e980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e990: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
e9a0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
e9b0: 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29  t, "index_info")
e9c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
e9d0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
e9e0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62  e *pTab;.    Vdb
e9f0: 65 20 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d  e *v;.    pIdx =
ea00: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
ea10: 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  (db, zRight);.  
ea20: 20 20 69 66 28 20 70 49 64 78 20 29 20 76 20 3d    if( pIdx ) v =
ea30: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
ea40: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
ea50: 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20  pIdx && v ){.   
ea60: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
ea70: 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
ea80: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
ea90: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
eaa0: 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 3, 0,       0}
eab0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
eac0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
ead0: 2c 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d  ,       "seqno"}
eae0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
eaf0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30  olumnName,  1, 0
eb00: 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a  ,       "cid"},.
eb10: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
eb20: 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
eb30: 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
eb40: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
eb50: 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20  t i;.      pTab 
eb60: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
eb80: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
eb90: 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f  aySize(tableInfo
eba0: 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49  Preface), tableI
ebb0: 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20  nfoPreface);.   
ebc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
ebd0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
ebe0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
ebf0: 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  num = pIdx->aiCo
ec00: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
ec10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ec20: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ec30: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
ec40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ec50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e  , OP_Integer, cn
ec60: 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
ec70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ec80: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
ec90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
eca0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
ecb0: 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cnum );.        
ecc0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
ecd0: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
ece0: 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65  aCol[cnum].zName
ecf0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
ed00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ed10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
ed20: 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20  back, 3, 0);.   
ed30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
ed40: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
ed50: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
ed60: 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20  index_list")==0 
ed70: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
ed80: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
ed90: 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
eda0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
edb0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
edc0: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
edd0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
ede0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
edf0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
ee00: 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49   pIdx = pTab->pI
ee10: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
ee20: 69 66 28 20 70 54 61 62 20 26 26 20 70 49 64 78  if( pTab && pIdx
ee30: 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 69   && v ){.      i
ee40: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
ee50: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69   static VdbeOp i
ee60: 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b  ndexListPreface[
ee70: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
ee80: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
ee90: 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
eea0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
eeb0: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
eec0: 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20        "seq"},.  
eed0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
eee0: 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
eef0: 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
ef00: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
ef10: 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
ef20: 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20     "unique"},.  
ef30: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71      };..      sq
ef40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
ef50: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69  t(v, ArraySize(i
ef60: 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
ef70: 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  , indexListPrefa
ef80: 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ce);.      while
ef90: 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20  (pIdx){.        
efa0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
efb0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
efc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
efd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
efe0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
eff0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f000: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
f010: 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
f020: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
f030: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f040: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f050: 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ger, pIdx->onErr
f060: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b  or!=OE_None, 0);
f070: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
f080: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f090: 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
f0a0: 09 2b 2b 69 3b 0a 09 70 49 64 78 20 3d 20 70 49  .++i;..pIdx = pI
f0b0: 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  dx->pNext;.     
f0c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
f0d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
f0e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
f0f0: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72  ICmp(zLeft, "par
f100: 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  ser_trace")==0 )
f110: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
f120: 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72  d sqliteParserTr
f130: 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20  ace(FILE*, char 
f140: 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42  *);.    if( getB
f150: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
f160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 61  {.      sqlitePa
f170: 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75 74  rserTrace(stdout
f180: 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20  , "parser: ");. 
f190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1a0: 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
f1b0: 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e(0, 0);.    }. 
f1c0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
f1d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
f1e0: 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67  mp(zLeft, "integ
f1f0: 72 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20  rity_check")==0 
f200: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
f210: 62 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d  beOp checkDb[] =
f220: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65   {.      { OP_Se
f230: 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c  tInsert,   0, 0,
f240: 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20          "2"},.  
f250: 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20      { OP_Open,  
f260: 20 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20        0, 2,     
f270: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
f280: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30  P_Rewind,      0
f290: 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 6,        0},.
f2a0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
f2b0: 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20  n,      0, 3,   
f2c0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
f2d0: 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
f2e0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
f2f0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
f300: 74 2c 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20  t,        0, 3, 
f310: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
f320: 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43   { OP_IntegrityC
f330: 6b 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  k, 0, 0,        
f340: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
f350: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
f360: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f370: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
f380: 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
f390: 20 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65    "integrity_che
f3a0: 63 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  ck"},.      { OP
f3b0: 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
f3c0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
f3d0: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
f3e0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
f3f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f400: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
f410: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
f420: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f430: 61 79 53 69 7a 65 28 63 68 65 63 6b 44 62 29 2c  aySize(checkDb),
f440: 20 63 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c   checkDb);.  }el
f450: 73 65 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74  se..  {}.  sqlit
f460: 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20  eFree(zLeft);.  
f470: 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68  sqliteFree(zRigh
f480: 74 29 3b 0a 7d 0a                                t);.}.