/ Hex Artifact Content
Login

Artifact 29504057ac5e2f40c08f19cb1574bd0512353169:


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 65 78 70 72 65    creating expre
0290: 73 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69  ssions and ID li
02a0: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02b0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02c0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02d0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02e0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02f0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
0300: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0310: 69 6c 64 2e 63 2c 76 20 31 2e 37 34 20 32 30 30  ild.c,v 1.74 200
0320: 32 2f 30 32 2f 30 33 20 31 37 3a 33 37 3a 33 36  2/02/03 17:37:36
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0820: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0830: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0840: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0850: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
0860: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
0870: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0880: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0890: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
08a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
08b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
08c0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
08d0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
08e0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
08f0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0900: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0910: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0920: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0930: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0940: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0950: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0960: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0970: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0980: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  eExprDelete(pLef
0990: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  t);.    sqliteEx
09a0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
09b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
09c0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
09d0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
09e0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
09f0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
0a00: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
0a10: 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  n ){.    pNew->t
0a20: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
0a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0a40: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b  w->token.z = "";
0a50: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0a60: 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .n = 0;.  }.  if
0a70: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
0a80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  t ){.    sqliteE
0a90: 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70  xprSpan(pNew, &p
0aa0: 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69  Left->span, &pRi
0ab0: 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65  ght->span);.  }e
0ac0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  lse{.    pNew->s
0ad0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
0ae0: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
0af0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pNew;.}../*.** S
0b00: 65 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  et the Expr.toke
0b10: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
0b20: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
0b30: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
0b40: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
0b50: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
0b60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0b70: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
0b80: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
0b90: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
0ba0: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  t){.  if( pExpr 
0bb0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
0bc0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
0bd0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e  .    pExpr->span
0be0: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
0bf0: 20 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29   Addr(pRight->z)
0c00: 20 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a   - Addr(pLeft->z
0c10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0c20: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
0c30: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
0c40: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
0c50: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
0c60: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
0c70: 70 72 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75  pr *sqliteExprFu
0c80: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
0c90: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
0ca0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
0cb0: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
0cc0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0cd0: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
0ce0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0cf0: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
0d00: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
0d10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
0d20: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0d30: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
0d40: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
0d50: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
0d60: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
0d70: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
0d80: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
0d90: 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20  token.z = "";.  
0da0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20    pNew->token.n 
0db0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0dc0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0dd0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
0de0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
0df0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
0e00: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
0e10: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
0e20: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
0e30: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 20   of that table. 
0e40: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0e50: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54 61  not found..*/.Ta
0e60: 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64 54  ble *sqliteFindT
0e70: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
0e80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0e90: 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c 69   Table *p = sqli
0ea0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
0eb0: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
0ec0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
0ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
0ee0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
0ef0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
0f00: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
0f10: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
0f20: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
0f30: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
0f40: 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  at index..** Ret
0f50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0f60: 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  found..*/.Index 
0f70: 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78  *sqliteFindIndex
0f80: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61  (sqlite *db, cha
0f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  r *zName){.  Ind
0fa0: 65 78 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61  ex *p = sqliteHa
0fb0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0fc0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0fd0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0fe0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0ff0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1000: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1010: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1020: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1030: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1040: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1050: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1060: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1070: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1080: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1090: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
10a0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
10b0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
10c0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
10d0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
10e0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
10f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1100: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1110: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
1120: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
1130: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
1140: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
1150: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
1160: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
1170: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1180: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
1190: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
11a0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
11b0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
11c0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
11d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
11e0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
11f0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
1200: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
1210: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
1220: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1230: 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 2c 20 70  (&db->idxDrop, p
1240: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1250: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1260: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
1270: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  ven index from i
1280: 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ts table, then r
1290: 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64  emove.** the ind
12a0: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
12b0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
12c0: 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79   free its memory
12d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a  .** structures..
12e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e  */.void sqliteUn
12f0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
1300: 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49  ex(sqlite *db, I
1310: 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
1320: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
1330: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
1340: 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  dex ){.    pInde
1350: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1360: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
1370: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1380: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f  Index *p;.    fo
1390: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
13a0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
13b0: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
13c0: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
13d0: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d  .    if( p && p-
13e0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
13f0: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
1400: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1420: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1430: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  db, pIndex);.}..
1440: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67  /*.** Move the g
1450: 69 76 65 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  iven index to th
1460: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 49  e pending DROP I
1470: 4e 44 45 58 20 71 75 65 75 65 20 69 66 20 69 74  NDEX queue if it
1480: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d   has.** been com
1490: 6d 69 74 74 65 64 2e 20 20 49 66 20 74 68 69 73  mitted.  If this
14a0: 20 69 6e 64 65 78 20 77 61 73 20 6e 65 76 65 72   index was never
14b0: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14c0: 20 6a 75 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20   just.** delete 
14d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  it..**.** Indice
14e0: 73 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  s on the pending
14f0: 20 64 72 6f 70 20 71 75 65 75 65 20 61 72 65 20   drop queue are 
1500: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 61 20 43  deleted when a C
1510: 4f 4d 4d 49 54 20 69 73 0a 2a 2a 20 65 78 65 63  OMMIT is.** exec
1520: 75 74 65 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c  uted.  If a ROLL
1530: 42 41 43 4b 20 6f 63 63 75 72 73 2c 20 74 68 65  BACK occurs, the
1540: 20 69 6e 64 69 63 65 73 20 61 72 65 20 6d 6f 76   indices are mov
1550: 65 64 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20  ed back into.** 
1560: 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 20 68  the main index h
1570: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ash table..*/.st
1580: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1590: 50 65 6e 64 69 6e 67 44 72 6f 70 49 6e 64 65 78  PendingDropIndex
15a0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
15b0: 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70  ex *p){.  if( !p
15c0: 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ->isCommit ){.  
15d0: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
15e0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
15f0: 20 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   p);.  }else{.  
1600: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20    Index *pOld;. 
1610: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
1620: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1630: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
1640: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
1650: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 20 20 69  me)+1, 0);.    i
1660: 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f  f( pOld!=0 && pO
1670: 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ld!=p ){.      s
1680: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1690: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 4f  &db->idxHash, pO
16a0: 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ld->zName, strle
16b0: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
16c0: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
16d0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
16e0: 65 72 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ert(&db->idxDrop
16f0: 2c 20 70 2c 20 30 2c 20 70 29 3b 0a 20 20 20 20  , p, 0, p);.    
1700: 70 2d 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 31  p->isDropped = 1
1710: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1720: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
1730: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
1740: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1750: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
1760: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
1770: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
1780: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
1790: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
17a0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
17b0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
17c0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
17d0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
17e0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
17f0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
1800: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
1810: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
1820: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
1830: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
1840: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1850: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 2e 0a  with the table..
1860: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
1870: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1880: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
1890: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
18a0: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
18b0: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
18c0: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
18d0: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
18e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
18f0: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
1900: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
1910: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
1920: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
1930: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1940: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  teDeleteTable(sq
1950: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
1960: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
1970: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
1980: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  ex, *pNext;.  if
1990: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
19a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
19b0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
19c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
19d0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
19e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
19f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1a00: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
1a10: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
1a20: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1a30: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
1a40: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
1a50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
1a60: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
1a70: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
1a80: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1a90: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1aa0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1ab0: 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
1ac0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
1ad0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
1ae0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
1af0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
1b00: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
1b10: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1b20: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
1b30: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
1b40: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
1b50: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
1b60: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
1b70: 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndices..*/.stati
1b80: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  c void sqliteUnl
1b90: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
1ba0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
1bb0: 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65  ble *p){.  Table
1bc0: 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74   *pOld;.  assert
1bd0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
1be0: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1bf0: 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  sert(&db->tblHas
1c00: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
1c10: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
1c20: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
1c30: 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d  Old==0 || pOld==
1c40: 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73  p );.  sqliteHas
1c50: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
1c60: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
1c70: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
1c80: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ble(db, p);.}../
1c90: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69  *.** Move the gi
1ca0: 76 65 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65  ven table to the
1cb0: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41   pending DROP TA
1cc0: 42 4c 45 20 71 75 65 75 65 20 69 66 20 69 74 20  BLE queue if it 
1cd0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d  has.** been comm
1ce0: 69 74 74 65 64 2e 20 20 49 66 20 74 68 69 73 20  itted.  If this 
1cf0: 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20  table was never 
1d00: 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1d10: 6a 75 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69  just.** delete i
1d20: 74 2e 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20  t.  Do the same 
1d30: 66 6f 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  for all its indi
1d40: 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65  ces..**.** Table
1d50: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1d60: 75 65 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61  ue are not actua
1d70: 6c 6c 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69  lly deleted unti
1d80: 6c 20 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74  l a COMMIT.** st
1d90: 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75  atement is execu
1da0: 74 65 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42  ted.  If a ROLLB
1db0: 41 43 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65  ACK occurs inste
1dc0: 61 64 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a  ad of a COMMIT,.
1dd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  ** then the tabl
1de0: 65 73 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71  es on the drop q
1df0: 75 65 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62  ueue are moved b
1e00: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ack into the mai
1e10: 6e 0a 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e  n.** hash table.
1e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e30: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
1e40: 70 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64  pTable(sqlite *d
1e50: 62 2c 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b  b, Table *pTbl){
1e60: 0a 20 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73  .  if( !pTbl->is
1e70: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
1e80: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
1e90: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62  eteTable(db, pTb
1ea0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
1eb0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
1ec0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
1ed0: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c   *pNext;.    pOl
1ee0: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1ef0: 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  sert(&db->tblHas
1f00: 68 2c 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20  h, pTbl->zName, 
1f10: 73 74 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61  strlen(pTbl->zNa
1f20: 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73  me)+1,0);.    as
1f30: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c  sert( pOld==pTbl
1f40: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61   );.    sqliteHa
1f50: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62  shInsert(&db->tb
1f60: 6c 44 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20  lDrop, pTbl, 0, 
1f70: 70 54 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70  pTbl);.    for(p
1f80: 49 6e 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49  Index = pTbl->pI
1f90: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
1fa0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
1fb0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
1fc0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
1fd0: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
1fe0: 70 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  pIndex(db, pInde
1ff0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  x);.    }.  }.}.
2000: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c  ./*.** Check all
2010: 20 54 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65   Tables and Inde
2020: 78 65 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72  xes in the inter
2030: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61  nal hash table a
2040: 6e 64 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79  nd commit.** any
2050: 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65   additions or de
2060: 6c 65 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65  letions to those
2070: 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a   hash tables..**
2080: 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69  .** When executi
2090: 6e 67 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ng CREATE TABLE 
20a0: 61 6e 64 20 43 52 45 41 54 45 20 49 4e 44 45 58  and CREATE INDEX
20b0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65   statements, the
20c0: 20 54 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e   Table.** and In
20d0: 64 65 78 20 73 74 72 75 63 74 75 72 65 73 20 61  dex structures a
20e0: 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  re created and a
20f0: 64 64 65 64 20 74 6f 20 74 68 65 20 68 61 73 68  dded to the hash
2100: 20 74 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20   tables, but.** 
2110: 74 68 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66  the "isCommit" f
2120: 69 65 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e  ield is not set.
2130: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
2140: 65 74 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ets those fields
2150: 2e 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74  ..** When execut
2160: 69 6e 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61  ing DROP TABLE a
2170: 6e 64 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74  nd DROP INDEX, t
2180: 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
2190: 78 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  x structures.** 
21a0: 61 72 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66  are moved out of
21b0: 20 74 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78   tblHash and idx
21c0: 48 61 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f  Hash into tblDro
21d0: 70 20 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20  p and idxDrop.  
21e0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
21f0: 64 65 6c 65 74 65 73 20 74 68 65 20 73 74 72 75  deletes the stru
2200: 63 74 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70  cture in tblDrop
2210: 20 61 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a   and idxDrop..**
2220: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
2230: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
2240: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f  rnalChanges().*/
2250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
2260: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2270: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2280: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
2290: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
22a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
22b0: 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20  rnChanges)==0 ) 
22c0: 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63  return;.  db->sc
22d0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62  hema_cookie = db
22e0: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20  ->next_cookie;. 
22f0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2300: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
2310: 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  tblHash); pElem;
2320: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2330: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2340: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2350: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2360: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54  a(pElem);.    pT
2370: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d  able->isCommit =
2380: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45   1;.  }.  for(pE
2390: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23a0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
23b0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
23c0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
23d0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
23e0: 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  e *pTable = sqli
23f0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
2410: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
2420: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
2430: 74 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  teHashClear(&db-
2440: 3e 74 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72  >tblDrop);.  for
2450: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2460: 68 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48  hFirst(&db->idxH
2470: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
2480: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2490: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
24a0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73  ndex *pIndex = s
24b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
24c0: 6c 65 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  lem);.    pIndex
24d0: 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  ->isCommit = 1;.
24e0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45    }.  while( (pE
24f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2500: 72 73 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  rst(&db->idxDrop
2510: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  ))!=0 ){.    Ind
2520: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2530: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2540: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
2550: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2560: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2570: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2580: 43 6c 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72  Clear(&db->idxDr
2590: 6f 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  op);.  db->flags
25a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
25b0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
25c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25d0: 20 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f   runs when one o
25e0: 72 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41  r more CREATE TA
25f0: 42 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45  BLE, CREATE INDE
2600: 58 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45  X,.** DROP TABLE
2610: 2c 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20  , or DROP INDEX 
2620: 73 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20  statements gets 
2630: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68  rolled back.  Th
2640: 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f  e.** additions o
2650: 72 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54  r deletions of T
2660: 61 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73  able and Index s
2670: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
2680: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
2690: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64  h tables are und
26a0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  one..**.** See a
26b0: 6c 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69  lso: sqliteCommi
26c0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
26d0: 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ().*/.void sqlit
26e0: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
26f0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2700: 2a 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44  *db){.  Hash toD
2710: 65 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65  elete;.  HashEle
2720: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20  m *pElem;.  if( 
2730: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2740: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2750: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
2760: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
2770: 28 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49  (&toDelete, SQLI
2780: 54 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c  TE_HASH_POINTER,
2790: 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f   0);.  db->next_
27a0: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
27b0: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f  ema_cookie;.  fo
27c0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
27e0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
27f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2800: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2810: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20  Table *pTable = 
2820: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2830: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21  Elem);.    if( !
2840: 70 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74  pTable->isCommit
2850: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2860: 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65  HashInsert(&toDe
2870: 6c 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c  lete, pTable, 0,
2880: 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a   pTable);.    }.
2890: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
28a0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
28b0: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
28c0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
28d0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
28e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
28f0: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
2900: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2910: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2920: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2930: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
2940: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
2950: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
2960: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2970: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72  First(&db->tblDr
2980: 6f 70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  op); pElem; pEle
2990: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
29a0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
29b0: 62 6c 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20  ble *pOld, *p = 
29c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
29d0: 45 6c 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72  Elem);.    asser
29e0: 74 28 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  t( p->isCommit )
29f0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
2a00: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
2a10: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
2a20: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
2a30: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
2a40: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
2a50: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
2a60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2a70: 43 6c 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72  Clear(&db->tblDr
2a80: 6f 70 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  op);.  for(pElem
2a90: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2aa0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20  (&db->idxHash); 
2ab0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2ac0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2ad0: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
2ae0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48  pIndex = sqliteH
2af0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2b00: 20 20 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d      if( !pIndex-
2b10: 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  >isCommit ){.   
2b20: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2b30: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
2b40: 49 6e 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78  Index, 0, pIndex
2b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
2b60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2b70: 61 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65  ashFirst(&toDele
2b80: 74 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  te); pElem; pEle
2b90: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2ba0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
2bb0: 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  dex *pIndex = sq
2bc0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2bd0: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55  em);.    sqliteU
2be0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2bf0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
2c00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
2c10: 68 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65  hClear(&toDelete
2c20: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2c30: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2c40: 64 62 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45  db->idxDrop); pE
2c50: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2c60: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2c70: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  ){.    Index *pO
2c80: 6c 64 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48  ld, *p = sqliteH
2c90: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2cb0: 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70  sCommit );.    p
2cc0: 2d 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b  ->isDropped = 0;
2cd0: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
2ce0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2cf0: 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->idxHash, p->zN
2d00: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
2d10: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
2d20: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2d30: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
2d40: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2d50: 6c 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f  lear(&db->idxDro
2d60: 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  p);.  db->flags 
2d70: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2d80: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2d90: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
2da0: 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20   name of a user 
2db0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
2dc0: 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a  rom a token..**.
2dd0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
2de0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74   the name is obt
2df0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2e00: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
2e10: 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  st.** be freed b
2e20: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2e30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
2e40: 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65  *sqliteTableName
2e50: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
2e60: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
2e70: 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  *zName = sqliteS
2e80: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
2e90: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71   pName->n);.  sq
2ea0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d  liteDequote(zNam
2eb0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61  e);.  return zNa
2ec0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  me;.}../*.** Beg
2ed0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
2ee0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
2ef0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
2f00: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
2f10: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
2f20: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
2f30: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
2f40: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
2f50: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
2f60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2f70: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
2f80: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
2f90: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
2fa0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
2fb0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
2fc0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
2fd0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a  ble name.  The.*
2fe0: 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69  * pStart token i
2ff0: 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64  s the CREATE and
3000: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61   pName is the ta
3010: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
3020: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
3030: 20 74 72 75 65 20 69 66 20 74 68 65 20 22 54 45   true if the "TE
3040: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
3050: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
3060: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
3070: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
3080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
3090: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
30a0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
30b0: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
30c0: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
30d0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
30e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
30f0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
3100: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
3110: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
3120: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
3130: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
3140: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
3150: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
3160: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3170: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
3180: 74 68 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62  the sqliteEndTab
3190: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
31a0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
31b0: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
31c0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
31d0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
31e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74  */.void sqliteSt
31f0: 61 72 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a  artTable(Parse *
3200: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3210: 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Start, Token *pN
3220: 61 6d 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29  ame, int isTemp)
3230: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
3240: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
3250: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
3260: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
3270: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
3280: 62 65 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65  be *v;..  pParse
3290: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20  ->sFirstToken = 
32a0: 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65  *pStart;.  zName
32b0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
32c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
32d0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
32e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
32f0: 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67  /* Before trying
3300: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d   to create a tem
3310: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61  porary table, ma
3320: 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65  ke sure the Btre
3330: 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69  e for.  ** holdi
3340: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
3350: 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a  les is open..  *
3360: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  /.  if( isTemp &
3370: 26 20 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30  & db->pBeTemp==0
3380: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
3390: 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e   sqliteBtreeOpen
33a0: 28 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53  (0, 0, MAX_PAGES
33b0: 2c 20 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b  , &db->pBeTemp);
33c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
33d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33e0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
33f0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3400: 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  g, "unable to op
3410: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
3420: 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
3430: 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
3440: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
3450: 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20  bles", 0);.     
3460: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
3490: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
34a0: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  InTrans ){.     
34b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
34c0: 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
34d0: 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  pBeTemp);.      
34e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
3500: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
3510: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3520: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
3530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
3540: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
3550: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
3560: 73 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20  se file", 0);.  
3570: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3580: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
3590: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
35a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
35b0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
35c0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
35d0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
35e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
35f0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
3600: 20 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e   name.  Issue an
3610: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
3620: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a  f it does..  **.
3630: 20 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72    ** If we are r
3640: 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e-reading the sq
3650: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
3660: 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73  e because of a s
3670: 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67  chema.  ** chang
3680: 65 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d  e and a new perm
3690: 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66  anent table is f
36a0: 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20  ound whose name 
36b0: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20  collides with.  
36c0: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  ** an existing t
36d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
36e0: 74 68 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20  then ignore the 
36f0: 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  new permanent ta
3700: 62 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c  ble..  ** We wil
3710: 6c 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69  l continue parsi
3720: 6e 67 2c 20 62 75 74 20 74 68 65 20 70 50 61 72  ng, but the pPar
3730: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c  se->nameClash fl
3740: 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20  ag will be set. 
3750: 20 2a 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b   ** so we will k
3760: 6e 6f 77 20 74 6f 20 64 69 73 63 61 72 64 20 74  now to discard t
3770: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
3780: 6f 6e 63 65 20 70 61 72 73 69 6e 67 20 68 61 73  once parsing has
3790: 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a   finished..  */.
37a0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
37b0: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
37c0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
37d0: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ble!=0 ){.    if
37e0: 28 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  ( pTable->isTemp
37f0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
3800: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50  Flag ){.      pP
3810: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20  arse->nameClash 
3820: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
3830: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
3840: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3850: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
3860: 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ", 0, pName->z, 
3870: 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20  pName->n,.      
3880: 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78      " already ex
3890: 69 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20  ists", 0, 0);.  
38a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
38b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Name);.      pPa
38c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
38d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
38e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
38f0: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20  arse->nameClash 
3900: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  = 0;.  }.  if( (
3910: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e  pIdx = sqliteFin
3920: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
3930: 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  ))!=0 &&.       
3940: 20 20 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c     (!pIdx->pTabl
3950: 65 2d 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50  e->isTemp || !pP
3960: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20  arse->initFlag) 
3970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
3980: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3990: 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20  zErrMsg, "there 
39a0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
39b0: 64 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20  dex named ", .  
39c0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
39d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
39e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
39f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
3a00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
3a10: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
3a20: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
3a30: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
3a40: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
3a50: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3a60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3a70: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
3a80: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
3a90: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
3aa0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
3ab0: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
3ac0: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
3ad0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
3ae0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69  able->isTemp = i
3af0: 73 54 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61  sTemp;.  if( pPa
3b00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
3b10: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
3b20: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  le(db, pParse->p
3b30: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
3b40: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
3b50: 20 70 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 21   pTable;.  if( !
3b60: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
3b70: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47   && (v = sqliteG
3b80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
3b90: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3ba0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
3bb0: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
3bc0: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
3bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
3bf0: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 66 69 6c 65 5f  ookie, db->file_
3c00: 66 6f 72 6d 61 74 2c 20 31 29 3b 0a 20 20 20 20  format, 1);.    
3c10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3c20: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3c30: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
3c40: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
3c50: 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52  P3(v, -1, MASTER
3c60: 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43  _NAME, P3_STATIC
3c70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
3c80: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
3c90: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
3ca0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
3cb0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
3cc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
3cd0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
3ce0: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
3cf0: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
3d00: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
3d10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3d20: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 53 74 61  ment.  sqliteSta
3d30: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
3d40: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
3d50: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
3d60: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
3d70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3d80: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
3d90: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
3da0: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  iteAddColumn(Par
3db0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
3dc0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
3dd0: 6c 65 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 2a  le *p;.  char **
3de0: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
3df0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3e00: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
3e10: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
3e20: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
3e30: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
3e40: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
3e50: 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20  alloc( p->aCol, 
3e60: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
3e70: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
3e80: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
3e90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
3ea0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
3eb0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e   }.  memset(&p->
3ec0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30  aCol[p->nCol], 0
3ed0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
3ee0: 5b 30 5d 29 29 3b 0a 20 20 70 7a 20 3d 20 26 70  [0]));.  pz = &p
3ef0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b  ->aCol[p->nCol++
3f00: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ].zName;.  sqlit
3f10: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
3f20: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3f30: 3e 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  >n, 0);.  sqlite
3f40: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a  Dequote(*pz);.}.
3f50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3f60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3f70: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
3f80: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
3f90: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
3fa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3fb0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
3fc0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
3fd0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
3fe0: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
3ff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4000: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
4010: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
4020: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
4030: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
4040: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4050: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
4060: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
4070: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
4080: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
4090: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
40a0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
40b0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
40c0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
40d0: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
40e0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  .notNull = onErr
40f0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
4100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4110: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
4120: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
4130: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
4140: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
4150: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
4160: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
4170: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
4180: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
4190: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
41a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
41b0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
41c0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
41d0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
41e0: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
41f0: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
4200: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
4210: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
4220: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
4230: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
4240: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
4250: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
4260: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
4270: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
4280: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
4290: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  / .void sqliteAd
42a0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
42b0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
42c0: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
42d0: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
42e0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
42f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
4300: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 69 66 28   *z, **pz;.  if(
4310: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4320: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4330: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4340: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
4350: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
4360: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  = &p->aCol[i].zT
4370: 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74  ype;.  n = pLast
4380: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74  ->n + Addr(pLast
4390: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72  ->z) - Addr(pFir
43a0: 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  st->z);.  sqlite
43b0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
43c0: 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b  First->z, n, 0);
43d0: 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66  .  z = *pz;.  if
43e0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
43f0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b  .  for(i=j=0; z[
4400: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  i]; i++){.    in
4410: 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  t c = z[i];.    
4420: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
4430: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
4440: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
4450: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
4460: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
4470: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
4480: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
4490: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
44a0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
44b0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
44c0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
44d0: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
44e0: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
44f0: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
4500: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
4510: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
4520: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
4530: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4540: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
4550: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
4560: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
4570: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4580: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
4590: 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61  id sqliteAddDefa
45a0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
45b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
45c0: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
45d0: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
45e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
45f0: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
4600: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4610: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4620: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4630: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4640: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4650: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
4660: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
4670: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
4680: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22  tNString(pz, "-"
4690: 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  , 1, pVal->z, pV
46a0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  al->n, 0);.  }el
46b0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se{.    sqliteSe
46c0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61  tNString(pz, pVa
46d0: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
46e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44  );.  }.  sqliteD
46f0: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
4700: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
4710: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
4720: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
4730: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
4740: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
4750: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
4760: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
4770: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
4780: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
4790: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
47a0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
47b0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
47c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
47d0: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
47e0: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
47f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
4800: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
4810: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
4820: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
4830: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
4840: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
4850: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
4860: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
4870: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
4880: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
4890: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
48a0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
48b0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
48c0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
48d0: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
48e0: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
48f0: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
4900: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
4910: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
4920: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
4930: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
4940: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
4950: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
4960: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
4970: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
4980: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
4990: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
49a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
49b0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
49c0: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
49d0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
49e0: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
49f0: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
4a00: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
4a10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4a20: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
4a30: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
4a40: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4a50: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
4a60: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
4a70: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
4a80: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
4a90: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
4aa0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
4ab0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72  void sqliteAddPr
4ac0: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
4ad0: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
4ae0: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
4af0: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
4b00: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
4b10: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
4b20: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
4b30: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66   iCol = -1;.  if
4b40: 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
4b50: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rn;.  if( pTab->
4b60: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
4b70: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4b80: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4b90: 73 67 2c 20 22 74 61 62 6c 65 20 5c 22 22 2c 20  sg, "table \"", 
4ba0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
4bb0: 20 20 20 20 20 20 22 5c 22 20 68 61 73 20 6d 6f        "\" has mo
4bc0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
4bd0: 61 72 79 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20  ary key", 0);.  
4be0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4bf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4c00: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
4c10: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
4c20: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
4c30: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
4c40: 6c 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l - 1;.  }else i
4c50: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31  f( pList->nId==1
4c60: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c   ){.    for(iCol
4c70: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
4c80: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
4c90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
4ca0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 30  rICmp(pList->a[0
4cb0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
4cc0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
4cd0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4ce0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f   }.  }.  if( iCo
4cf0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
4d00: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  b->nCol ){.    z
4d10: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
4d20: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
4d30: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
4d40: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
4d50: 3e 3d 31 20 26 26 20 0a 20 20 20 20 20 20 20 20  >=1 && .        
4d60: 20 20 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69     zType && sqli
4d70: 74 65 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  teStrICmp(zType,
4d80: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
4d90: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
4da0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
4db0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
4dc0: 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Error;.  }else{.
4dd0: 20 20 20 20 73 71 6c 69 74 65 43 72 65 61 74 65      sqliteCreate
4de0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
4df0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
4e00: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  or, 0, 0);.  }.}
4e10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
4e20: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
4e30: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
4e40: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
4e50: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
4e60: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
4e70: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
4e80: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
4e90: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
4ea0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
4eb0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
4ec0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
4ed0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
4ee0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
4ef0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
4f00: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
4f10: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
4f20: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
4f30: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
4f40: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
4f50: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
4f60: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
4f70: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
4f80: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
4f90: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
4fa0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
4fb0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
4fc0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
4fd0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
4fe0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
4ff0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
5000: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
5010: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
5020: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
5030: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
5040: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
5050: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
5060: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
5070: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
5080: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
5090: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
50a0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
50b0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
50c0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
50d0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
50e0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
50f0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
5100: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
5110: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74   enough..*/.stat
5120: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 43 6f  ic void changeCo
5130: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 29  okie(sqlite *db)
5140: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
5150: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68  _cookie==db->sch
5160: 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20  ema_cookie ){.  
5170: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
5180: 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  e = db->schema_c
5190: 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61  ookie + sqliteRa
51a0: 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a  ndomByte() + 1;.
51b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
51c0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
51d0: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
51e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
51f0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
5200: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
5210: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
5220: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
5230: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
5240: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
5250: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
5260: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
5270: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
5280: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
5290: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
52a0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
52b0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
52c0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
52d0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
52e0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
52f0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
5300: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
5310: 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73  n disk,.** unles
5320: 73 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  s this is a temp
5330: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69  orary table or i
5340: 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65  nitFlag==1.  Whe
5350: 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a  n initFlag==1,.*
5360: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
5370: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
5380: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
5390: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
53a0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
53b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
53c0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
53d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
53e0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
53f0: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
5400: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
5410: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
5420: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
5430: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5440: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
5450: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
5460: 74 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64  t again..*/.void
5470: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
5480: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
5490: 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54  oken *pEnd){.  T
54a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
54b0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
54c0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d  db;..  if( pEnd=
54d0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
54e0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
54f0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
5500: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
5510: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
5520: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5530: 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  n;..  /* Add the
5540: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
5550: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
5560: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
5570: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
5580: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
5590: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20 70  ameClash==0 || p
55a0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d  Parse->initFlag=
55b0: 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =1 );.  if( pPar
55c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26  se->explain==0 &
55d0: 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  & pParse->nameCl
55e0: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  ash==0 ){.    Ta
55f0: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  ble *pOld;.    p
5600: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
5610: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
5620: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
5630: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
5640: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
5650: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
5660: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
5670: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
5680: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
5690: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
56a0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
56b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
56c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
56d0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
56e0: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
56f0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5700: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
5710: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
5720: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
5730: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
5740: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
5750: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
5760: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
5770: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
5780: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
5790: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
57a0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
57b0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
57c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
57d0: 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70 50  rom the .  ** pP
57e0: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
57f0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
5800: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68 61  number should ha
5810: 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a 2a  ve been put.  **
5820: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
5830: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
5840: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
5850: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
5860: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
5870: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
5880: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
5890: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
58a0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
58b0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
58c0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
58d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
58e0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
58f0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
5900: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
5910: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
5920: 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65 61  , then just crea
5930: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20 44  te the table.  D
5940: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65 20  o not.  ** make 
5950: 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c 49  an entry in SQLI
5960: 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a  TE_MASTER..  */.
5970: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
5980: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
5990: 6e 74 20 6e 2c 20 61 64 64 72 3b 0a 20 20 20 20  nt n, addr;.    
59a0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20  Vdbe *v;..    v 
59b0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
59c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
59d0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
59e0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
59f0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
5a00: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
5a10: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  .z) + 1;.    if(
5a20: 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20   !p->isTemp ){. 
5a30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
5a50: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
5a60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5a70: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
5a80: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
5a90: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
5aa0: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
5ab0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
5ac0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5ad0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
5ae0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
5af0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
5b00: 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  v, -1, p->zName,
5b10: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
5b20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5b30: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
5b40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
5b50: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5b60: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
5b70: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
5b80: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
5b90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5ba0: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
5bb0: 2c 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b  , 0, p->isTemp);
5bc0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
5bd0: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
5be0: 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75   (char *)&p->tnu
5bf0: 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  m, P3_POINTER);.
5c00: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b      p->tnum = 0;
5c10: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54  .    if( !p->isT
5c20: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64  emp ){.      add
5c30: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
5c40: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
5c50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
5c60: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5c70: 33 28 76 2c 20 61 64 64 72 2c 20 70 50 61 72 73  3(v, addr, pPars
5c80: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
5c90: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
5ca0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5cb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
5cc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5cd0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5ce0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
5cf0: 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 43  );.      changeC
5d00: 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20  ookie(db);.     
5d10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5d20: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
5d30: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
5d40: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
5d50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5d60: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
5d70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5d80: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
5d90: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
5da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5db0: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
5dc0: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
5dd0: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
5de0: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
5df0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
5e00: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
5e10: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
5e20: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
5e30: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
5e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
5e50: 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63  oken *pTok){.  c
5e60: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61  har *zName;.  Ta
5e70: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61  ble *pTab;.  zNa
5e80: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
5e90: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
5ea0: 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ok);.  if( zName
5eb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5ec0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
5ed0: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
5ee0: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  >db, zName);.  s
5ef0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
5f00: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
5f10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
5f20: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
5f30: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
5f40: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20  ch table: ", 0, 
5f50: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a  .        pTok->z
5f60: 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20  , pTok->n, 0);. 
5f70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5f80: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
5f90: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pTab;.}../*.** T
5fa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5fb0: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
5fc0: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
5fd0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
5fe0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
5ff0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6000: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
6010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
6020: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
6030: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
6040: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
6050: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
6060: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  v;.  int base;. 
6070: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
6080: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
6090: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
60a0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
60b0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
60c0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
60d0: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
60e0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
60f0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
6100: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6110: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
6120: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
6130: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
6140: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
6150: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
6160: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
6170: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
6180: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
6190: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
61a0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
61b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
61c0: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
61d0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
61e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
61f0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
6200: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
6210: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
6220: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
6230: 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d  beOp dropTable[]
6240: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
6250: 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32  OpenWrite,  0, 2
6260: 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f  ,        MASTER_
6270: 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  NAME},.      { O
6280: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
6290: 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20   ADDR(9),  0},. 
62a0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
62b0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
62c0: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
62d0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
62e0: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
62f0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
6300: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
6310: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
6320: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 4 */.      { O
6330: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
6340: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
6350: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
6360: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
6370: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
6380: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
6390: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
63a0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
63b0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 34 29        0, ADDR(4)
63c0: 2c 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20  ,  0}, /* 8 */. 
63d0: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
63e0: 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  kie,  0, 0,     
63f0: 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20     0}, /* 9 */. 
6400: 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c       { OP_Close,
6410: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
6420: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
6430: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
6440: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
6450: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
6460: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rse);.    if( !p
6470: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b  Table->isTemp ){
6480: 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71  .      base = sq
6490: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
64a0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
64b0: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
64c0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
64d0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
64e0: 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c  v, base+2, pTabl
64f0: 65 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  e->zName, P3_STA
6500: 54 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  TIC);.      chan
6510: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
6520: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6530: 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 39  angeP1(v, base+9
6540: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
6550: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
6560: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6570: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61   OP_Destroy, pTa
6580: 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  ble->tnum, pTabl
6590: 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  e->isTemp);.    
65a0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
65b0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
65c0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
65d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
65e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
65f0: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
6600: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
6610: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
6620: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
6630: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
6640: 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68   }..  /* Move th
6650: 65 20 74 61 62 6c 65 20 28 61 6e 64 20 61 6c 6c  e table (and all
6660: 20 69 74 73 20 69 6e 64 69 63 65 73 29 20 74 6f   its indices) to
6670: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f   the pending DRO
6680: 50 20 71 75 65 75 65 2e 0a 20 20 2a 2a 20 4f 72  P queue..  ** Or
6690: 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 77  , if the table w
66a0: 61 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74  as never committ
66b0: 65 64 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20  ed, just delete 
66c0: 69 74 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  it.  If the tabl
66d0: 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20  e.  ** has been 
66e0: 63 6f 6d 6d 69 74 74 65 64 20 61 6e 64 20 69 73  committed and is
66f0: 20 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 70   placed on the p
6700: 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75  ending DROP queu
6710: 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
6720: 20 64 65 6c 65 74 65 20 77 69 6c 6c 20 6f 63 63   delete will occ
6730: 75 72 20 77 68 65 6e 20 73 71 6c 69 74 65 43 6f  ur when sqliteCo
6740: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
6750: 67 65 73 28 29 20 65 78 65 63 75 74 65 73 2e 0a  ges() executes..
6760: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
6770: 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20  ion: if the SQL 
6780: 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20  statement began 
6790: 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e  with the EXPLAIN
67a0: 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74   keyword,.  ** t
67b0: 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73  hen no changes s
67c0: 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20  hould be made.. 
67d0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
67e0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
67f0: 20 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44    sqlitePendingD
6800: 72 6f 70 54 61 62 6c 65 28 64 62 2c 20 70 54 61  ropTable(db, pTa
6810: 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ble);.    db->fl
6820: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
6830: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
6840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
6850: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
6860: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
6870: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
6880: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
6890: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
68a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
68b0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
68c0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
68d0: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
68e0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
68f0: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
6900: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
6910: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
6920: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
6930: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
6940: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
6950: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
6960: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
6970: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
6980: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
6990: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
69a0: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
69b0: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
69c0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
69d0: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
69e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
69f0: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
6a00: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
6a10: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
6a20: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
6a30: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
6a40: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
6a50: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
6a60: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
6a70: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
6a80: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
6a90: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
6aa0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6ab0: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
6ac0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  eCreateIndex(.  
6ad0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6ae0: 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
6af0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
6b00: 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
6b10: 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  *pName,    /* Na
6b20: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
6b30: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
6b40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
6b50: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
6b60: 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65  he table to inde
6b70: 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e  x.  Use pParse->
6b80: 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
6b90: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  /.  IdList *pLis
6ba0: 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
6bb0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
6bc0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
6bd0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a   onError,     /*
6be0: 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
6bf0: 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
6c00: 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
6c10: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
6c20: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
6c30: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
6c40: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
6c50: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
6c60: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
6c70: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
6c80: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
6c90: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
6ca0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
6cb0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
6cc0: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
6cd0: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
6ce0: 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65  pIndex;   /* The
6cf0: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
6d00: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
6d10: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
6d20: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
6d30: 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20  ullId;          
6d40: 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
6d50: 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
6d60: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
6d70: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6d80: 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65 4e 61  db;.  int hideNa
6d90: 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
6da0: 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20 74 61  /* Do not put ta
6db0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6dc0: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  hash table */.. 
6dd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
6de0: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
6df0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
6e00: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
6e10: 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  ex;..  /*.  ** F
6e20: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
6e30: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
6e40: 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
6e50: 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
6e60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
6e70: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le!=0 ){.    ass
6e80: 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b  ert( pName!=0 );
6e90: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c  .    pTab =  sql
6ea0: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
6eb0: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
6ec0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6ed0: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
6ee0: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
6ef0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6f00: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  e;.  }.  if( pTa
6f10: 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
6f20: 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
6f30: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
6f40: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
6f50: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
6f60: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
6f70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
6f80: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
6f90: 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79  me, .      " may
6fa0: 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e   not have new in
6fb0: 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 30 29  dices added", 0)
6fc0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
6fd0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
6fe0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
6ff0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7000: 68 69 73 20 69 6e 64 65 78 20 69 73 20 63 72 65  his index is cre
7010: 61 74 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65  ated while re-re
7020: 61 64 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61  ading the schema
7030: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
7040: 74 65 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65  ter.  ** but the
7050: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
7060: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  d with this inde
7070: 78 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  x is a temporary
7080: 20 74 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20   table, it can. 
7090: 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68   ** only mean th
70a0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  at the table tha
70b0: 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  t this index is 
70c0: 72 65 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65  really associate
70d0: 64 20 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f  d with is.  ** o
70e0: 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73  ne whose name is
70f0: 20 68 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61   hidden behind a
7100: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7110: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
7120: 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ame..  ** Since 
7130: 69 74 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  its table has be
7140: 65 6e 20 73 75 70 70 72 65 73 73 65 64 2c 20 77  en suppressed, w
7150: 65 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73  e need to also s
7160: 75 70 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a  uppress the.  **
7170: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
7180: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
7190: 6c 61 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54  lag && pTab->isT
71a0: 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  emp ){.    goto 
71b0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
71c0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
71d0: 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
71e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
71f0: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
7200: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
7210: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
7220: 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
7230: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
7240: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
7250: 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
7260: 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
7270: 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
7280: 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
7290: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
72a0: 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
72b0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
72c0: 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
72d0: 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
72e0: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
72f0: 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
7300: 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
7310: 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
7320: 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
7330: 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
7340: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
7350: 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c  cess this index,
7360: 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74   but we will not
7370: 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20  .  ** store its 
7380: 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68  name in the hash
7390: 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65   table.  Set the
73a0: 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74   hideName flag t
73b0: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a  o accomplish.  *
73c0: 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  * this..  **.  *
73d0: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
73e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
73f0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
7400: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
7410: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
7420: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
7430: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
7440: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
7450: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
7460: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
7470: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
7480: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
7490: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
74a0: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
74b0: 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
74c0: 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
74d0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
74e0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d  ndex */.    zNam
74f0: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
7500: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
7510: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
7520: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
7530: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
7540: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
7550: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
7560: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
7570: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
7580: 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54  ( pISameName->pT
7590: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  able->isTemp && 
75a0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
75b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65   ){.        hide
75c0: 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Name = 1;.      
75d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
75e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
75f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
7600: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
7610: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  , .           " 
7620: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
7630: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
7640: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7650: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
7660: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
7670: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7680: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
7690: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
76a0: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
76b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53  ){.      if( pTS
76c0: 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20  ameName->isTemp 
76d0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
76e0: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
76f0: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
7700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7710: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
7720: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
7730: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
7740: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
7750: 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  med ",.         
7760: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
7770: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
7780: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
7790: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
77a0: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
77b0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
77c0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
77d0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
77e0: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
77f0: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
7800: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
7810: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
7820: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
7830: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
7840: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
7850: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
7860: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
7870: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
7880: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
7890: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
78a0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
78b0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
78c0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68  ate_index;.    h
78d0: 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ideName = sqlite
78e0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
78f0: 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20  ame)!=0;.  }..  
7900: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
7910: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
7920: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
7930: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
7940: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
7950: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
7960: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
7970: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
7980: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
7990: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
79a0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
79b0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
79c0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
79d0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
79e0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
79f0: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
7a00: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
7a10: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
7a20: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
7a30: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
7a40: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
7a50: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
7a60: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
7a70: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
7a80: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
7a90: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
7aa0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
7ab0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
7ac0: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
7ad0: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
7ae0: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
7b00: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
7b10: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
7b20: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
7b30: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7b40: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
7b50: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
7b60: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
7b70: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
7b80: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
7b90: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
7ba0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
7bb0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
7bc0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
7bd0: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
7be0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
7bf0: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
7c00: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  ex->onError = pI
7c10: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
7c20: 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20   onError;..  /* 
7c30: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
7c40: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
7c50: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
7c60: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
7c70: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
7c80: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
7c90: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
7ca0: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
7cb0: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
7cc0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
7cd0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
7ce0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
7cf0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
7d00: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
7d10: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
7d20: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
7d30: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
7d40: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
7d50: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
7d60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7d70: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
7d80: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
7d90: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
7da0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
7db0: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
7dc0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
7dd0: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
7de0: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
7df0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
7e00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
7e10: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
7e20: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
7e30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
7e40: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
7e50: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
7e60: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
7e70: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
7e80: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
7e90: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
7ea0: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
7eb0: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
7ec0: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
7ed0: 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
7ee0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
7ef0: 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d  lain && !hideNam
7f00: 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  e ){.    Index *
7f10: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
7f20: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
7f30: 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78  >idxHash, pIndex
7f40: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
7f50: 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
7f60: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
7f70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
7f80: 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
7f90: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
7fa0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
7fb0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
7fc0: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
7fd0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7fe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
7ff0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8000: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
8010: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
8020: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
8030: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
8040: 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
8050: 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
8060: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
8070: 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
8080: 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
8090: 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
80a0: 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
80b0: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
80c0: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
80d0: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
80e0: 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
80f0: 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
8100: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
8110: 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
8120: 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
8130: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
8140: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
8150: 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
8160: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
8170: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
8180: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
8190: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
81a0: 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
81b0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
81c0: 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
81d0: 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
81e0: 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
81f0: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
8200: 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
8210: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
8220: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
8230: 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
8240: 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
8250: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
8260: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
8270: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
8280: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
8290: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
82a0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
82b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
82c0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
82d0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
82e0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
82f0: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
8300: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
8310: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ber from the pPa
8320: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65  rse->newTnum fie
8330: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ld..  */.  if( p
8340: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
8350: 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  && pTable!=0 ){.
8360: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
8370: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
8380: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
8390: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
83a0: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
83b0: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
83c0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
83d0: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
83e0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
83f0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
8400: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
8410: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
8420: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
8430: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
8440: 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46  *.  ** The initF
8450: 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68  lag is 0 when th
8460: 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
8470: 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
8480: 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
8490: 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  .  The initFlag 
84a0: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
84b0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
84c0: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
84d0: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
84e0: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
84f0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
8500: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
8510: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
8520: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
8530: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
8540: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
8550: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
8560: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
8570: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
8580: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
8590: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
85a0: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
85b0: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
85c0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
85d0: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
85e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
85f0: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
8600: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
8610: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
8620: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
8630: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
8640: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
8650: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
8660: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
8670: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e  e if( pParse->in
8680: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
8690: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
86a0: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
86b0: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
86c0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
86d0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70  ;.    int isTemp
86e0: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b   = pTab->isTemp;
86f0: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
8700: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
8710: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
8720: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
8730: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
8740: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
8750: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
8760: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8770: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
8780: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
8790: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
87a0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
87b0: 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  te, 0, 2);.     
87c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
87d0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53  ngeP3(v, -1, MAS
87e0: 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41  TER_NAME, P3_STA
87f0: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
8800: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54    }.    if( !isT
8810: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
8820: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8830: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
8840: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8860: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
8870: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
8880: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
8890: 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
88a0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
88b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
88c0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
88d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
88e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
88f0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33  Index->zName, P3
8900: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
8910: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8920: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
8930: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8940: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
8950: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
8960: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
8970: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
8980: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8990: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
89a0: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
89b0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
89c0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
89d0: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e  har*)&pIndex->tn
89e0: 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  um, P3_POINTER);
89f0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
8a00: 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  m = 0;.    if( p
8a10: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
8a20: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
8a30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
8a50: 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rAux, 1, 0);.   
8a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8a70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8a80: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
8a90: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
8aa0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8ab0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
8ac0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8ad0: 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  }.    if( !isTem
8ae0: 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  p ){.      addr 
8af0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
8b00: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
8b10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
8b20: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
8b30: 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41  ){.        n = A
8b40: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
8b50: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
8b60: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
8b70: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
8b80: 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e  , addr, pStart->
8b90: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
8ba0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8bb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
8bc0: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
8bd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8be0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
8bf0: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
8c00: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  }.    if( pTable
8c10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8c20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73 54  VdbeAddOp(v, isT
8c30: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78  emp ? OP_OpenAux
8c40: 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20 70   : OP_Open, 2, p
8c50: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
8c60: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
8c70: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
8c80: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
8c90: 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20  IC);.      lbl2 
8ca0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
8cb0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
8cc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8cd0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c  v, OP_Rewind, 2,
8ce0: 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62   lbl2);.      lb
8cf0: 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  l1 = sqliteVdbeA
8d00: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f  ddOp(v, OP_Recno
8d10: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 2, 0);.      f
8d20: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
8d30: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
8d40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
8d60: 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65 78  olumn, 2, pIndex
8d70: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a  ->aiColumn[i]);.
8d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8d90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8da0: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20   OP_MakeIdxKey, 
8db0: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c  pIndex->nColumn,
8dc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8dd0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8de0: 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
8df0: 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
8e00: 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  None);.      sql
8e10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8e20: 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31  OP_Next, 2, lbl1
8e30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8e40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8e50: 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
8e60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8e70: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20  v, OP_Close, 2, 
8e80: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8e90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ea0: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
8eb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
8ec0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  le!=0 ){.      i
8ed0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
8ee0: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
8ef0: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ie(db);.        
8f00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8f10: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8f20: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
8f30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
8f40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8f50: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
8f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f70: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
8f80: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
8f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8fa0: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
8fb0: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
8fc0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
8fd0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
8fe0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
8ff0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
9000: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
9010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9020: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
9030: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
9040: 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
9050: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
9060: 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
9070: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9080: 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65  d sqliteDropInde
9090: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
90a0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
90b0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
90c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
90d0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
90e0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
90f0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
9100: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9110: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
9120: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e  d ) return;.  zN
9130: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
9140: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
9150: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
9160: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
9170: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
9180: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
9190: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
91a0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
91b0: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
91c0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
91d0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
91e0: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69  rMsg, "no such i
91f0: 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20  ndex: ", 0, .   
9200: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70       pName->z, p
9210: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
9220: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9230: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9240: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
9250: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
9260: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
9270: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
9280: 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
9290: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
92a0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
92b0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
92c0: 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a  dropIndex[] = {.
92d0: 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57        { OP_OpenW
92e0: 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20 20  rite,  0, 2,    
92f0: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c     MASTER_NAME},
9300: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
9310: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
9320: 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20 20 20 7b  10),0}, .      {
9330: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
9340: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
9350: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 2 */.      { 
9360: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
9370: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
9380: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
9390: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
93a0: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
93b0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
93c0: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
93d0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
93e0: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
93f0: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
9400: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
9410: 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20 30     0, ADDR(4), 0
9420: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
9430: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
9440: 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20 20 20 20  R(10),0},.      
9450: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
9460: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
9470: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 9 */.      {
9480: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
9490: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
94a0: 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 10 */.      {
94b0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20   OP_Close,      
94c0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
94d0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62      };.    int b
94e0: 61 73 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ase;.    Table *
94f0: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
9500: 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c 69  Table;..    sqli
9510: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
9520: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
9530: 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73     if( !pTab->is
9540: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61  Temp ){.      ba
9550: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
9560: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
9570: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
9580: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
9590: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
95a0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32  angeP3(v, base+2
95b0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
95c0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
95d0: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
95e0: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
95f0: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
9600: 20 62 61 73 65 2b 31 30 2c 20 64 62 2d 3e 6e 65   base+10, db->ne
9610: 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  xt_cookie);.    
9620: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
9630: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
9640: 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
9650: 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29  m, pTab->isTemp)
9660: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
9670: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
9680: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
9690: 20 4d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20   Move the index 
96a0: 6f 6e 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  onto the pending
96b0: 20 44 52 4f 50 20 71 75 65 75 65 2e 20 20 4f 72   DROP queue.  Or
96c0: 2c 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  , if the index w
96d0: 61 73 0a 20 20 2a 2a 20 6e 65 76 65 72 20 63 6f  as.  ** never co
96e0: 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65  mmitted, just de
96f0: 6c 65 74 65 20 69 74 2e 20 20 49 6e 64 69 63 65  lete it.  Indice
9700: 73 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  s on the pending
9710: 20 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a 2a   DROP queue.  **
9720: 20 67 65 74 20 64 65 6c 65 74 65 64 20 62 79 20   get deleted by 
9730: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
9740: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 77 68  rnalChanges() wh
9750: 65 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63  en the user exec
9760: 75 74 65 73 0a 20 20 2a 2a 20 61 20 43 4f 4d 4d  utes.  ** a COMM
9770: 49 54 2e 20 20 4f 72 20 69 66 20 61 20 72 6f 6c  IT.  Or if a rol
9780: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 20 74 68  lback occurs, th
9790: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
97a0: 65 20 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a  e DROP queue.  *
97b0: 2a 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b  * are moved back
97c0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 68   into the main h
97d0: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
97e0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
97f0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
9800: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
9810: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
9820: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
9830: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
9840: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
9850: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9860: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9870: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9880: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9890: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
98a0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
98b0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
98c0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
98d0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
98e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
98f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9900: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
9910: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
9920: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
9930: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
9940: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
9950: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
9960: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
9970: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  st==0 ){.      s
9980: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
9990: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
99a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
99b0: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
99c0: 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29 7b  nExpr & 7)==0 ){
99d0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
99e0: 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a 20  st->nExpr + 8;. 
99f0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
9a00: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
9a10: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
9a20: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  c(pList->a, n*si
9a30: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
9a40: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
9a50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9a60: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
9a70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9a80: 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pList;.    }.   
9a90: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
9aa0: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c   }.  if( pExpr |
9ab0: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  | pName ){.    i
9ac0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b   = pList->nExpr+
9ad0: 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  +;.    pList->a[
9ae0: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
9af0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  ;.    pList->a[i
9b00: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
9b10: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
9b20: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
9b30: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
9b40: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
9b50: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
9b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
9b70: 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  uote(pList->a[i]
9b80: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
9b90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
9ba0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
9bb0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
9bc0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
9bd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
9be0: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
9bf0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
9c00: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
9c10: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
9c20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
9c30: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
9c40: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
9c50: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
9c60: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  .pExpr);.    sql
9c70: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
9c80: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
9c90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
9ca0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
9cb0: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
9cc0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
9cd0: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
9ce0: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
9cf0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
9d00: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
9d10: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
9d20: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
9d30: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
9d40: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
9d50: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
9d60: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
9d70: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
9d80: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
9d90: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
9da0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
9db0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
9dc0: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
9dd0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
9de0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9df0: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
9e00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9e10: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
9e20: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
9e30: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
9e40: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
9e50: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
9e60: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
9e70: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
9e80: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
9e90: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
9ea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
9eb0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
9ec0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
9ed0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
9ee0: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
9ef0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
9f00: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
9f10: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
9f20: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
9f30: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
9f40: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
9f50: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
9f60: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
9f70: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
9f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
9f90: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
9fa0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
9fb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9fc0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
9fd0: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
9fe0: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
9ff0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
a000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
a010: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
a020: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
a030: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
a040: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
a050: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
a060: 41 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20  AddAlias(IdList 
a070: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
a080: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
a090: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49  ist && pList->nI
a0a0: 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  d>0 ){.    int i
a0b0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20   = pList->nId - 
a0c0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
a0d0: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
a0e0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
a0f0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
a100: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
a110: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
a120: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
a130: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
a140: 65 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69  e an entire IdLi
a150: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
a160: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
a170: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
a180: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
a190: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
a1a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
a1b0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
a1c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
a1d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
a1e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
a1f0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
a200: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ias);.    if( pL
a210: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
a220: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
a230: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
a240: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
a250: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
a260: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
a270: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
a280: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
a290: 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
a2a0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
a2b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
a2c0: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
a2d0: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
a2e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
a2f0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
a300: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
a310: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
a320: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
a330: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
a340: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
a350: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
a360: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
a370: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
a380: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
a390: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
a3a0: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
a3b0: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
a3c0: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
a3d0: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
a3e0: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
a3f0: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
a400: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
a410: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
a420: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
a430: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
a440: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
a450: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
a460: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
a470: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
a480: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
a490: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
a4a0: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
a4b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a4c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
a4d0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
a4e0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
a4f0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  e,   /* The name
a500: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
a510: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
a520: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
a530: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
a540: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
a550: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
a560: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
a570: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
a580: 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20  miter,   /* Use 
a590: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
a5a0: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20  d delimiter */. 
a5b0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20   int onError    
a5c0: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
a5d0: 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61   do if a constra
a5e0: 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a  int fails */.){.
a5f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a600: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69   char *zTab;.  i
a610: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b  nt i;.  Vdbe *v;
a620: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64  .  int addr, end
a630: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
a640: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
a650: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a  pParse->db;..  z
a660: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
a670: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
a680: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66  TableName);.  if
a690: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
a6a0: 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d  failed || zTab==
a6b0: 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c  0 ) goto copy_cl
a6c0: 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20  eanup;.  pTab = 
a6d0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
a6e0: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  db, zTab);.  sql
a6f0: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
a700: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a710: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
a720: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
a730: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
a740: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
a750: 20 20 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65        pTableName
a760: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
a770: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
a780: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
a790: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
a7a0: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  p;.  }.  if( pTa
a7b0: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
a7c0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
a7d0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
a7e0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
a7f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
a800: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
a810: 20 6d 6f 64 69 66 69 65 64 22 2c 20 30 29 3b 0a   modified", 0);.
a820: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
a830: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70  ++;.    goto cop
a840: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  y_cleanup;.  }. 
a850: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
a860: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
a870: 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( v ){.    int o
a880: 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74  penOp;.    sqlit
a890: 65 42 65 67 69 6e 4d 75 6c 74 69 57 72 69 74 65  eBeginMultiWrite
a8a0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
a8b0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
a8c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a8d0: 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c   OP_FileOpen, 0,
a8e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
a8f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
a900: 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ddr, pFilename->
a910: 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29  z, pFilename->n)
a920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
a930: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
a940: 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d  r);.    openOp =
a950: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20   pTab->isTemp ? 
a960: 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f  OP_OpenWrAux : O
a970: 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
a980: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a990: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70  (v, openOp, 0, p
a9a0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
a9b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
a9c0: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
a9d0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
a9e0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
a9f0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
aa00: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
aa10: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
aa20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
aa30: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
aa40: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  , i, pIdx->tnum)
aa50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
aa60: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
aa70: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
aa80: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
aa90: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
aaa0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
aab0: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
aac0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
aad0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
aae0: 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0);  /* Initial
aaf0: 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  ize the row coun
ab00: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65  t */.    }.    e
ab10: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
ab20: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
ab30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
ab40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
ab50: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
ab60: 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66  ol, end);.    if
ab70: 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a  ( pDelimiter ){.
ab80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ab90: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
aba0: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c  , pDelimiter->z,
abb0: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b   pDelimiter->n);
abc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
abd0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
abe0: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
abf0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ac00: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
ac10: 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20  , "\t", 1);.    
ac20: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
ac30: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
ac40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ac50: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
ac60: 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c  mn, pTab->iPKey,
ac70: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ac80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ac90: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
aca0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
acb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
acc0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
acd0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  no, 0, 0);.    }
ace0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
acf0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
ad00: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
ad10: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
ad20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
ad30: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
ad40: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65   column is fille
ad50: 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63  d with NULL sinc
ad60: 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  e its.        **
ad70: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
ad80: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
ad90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
ada0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
adb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
adc0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
add0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ade0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
adf0: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
ae00: 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20  lumn, i, 0);.   
ae10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
ae20: 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e  qliteGenerateCon
ae30: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
ae40: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
ae50: 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c  , 0, 0, onError,
ae60: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
ae70: 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  teCompleteInsert
ae80: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
aea0: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
aeb0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
aec0: 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  Rows)!=0 ){.    
aed0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
aee0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
aef0: 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65  1, 0);  /* Incre
af00: 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  ment row count *
af10: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
af20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
af30: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
af40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
af50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
af60: 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  end);.    sqlite
af70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af80: 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
af90: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
afa0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
afb0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
afc0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
afd0: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20  ntRows ){.      
afe0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aff0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  v, OP_ColumnCoun
b000: 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
b010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b020: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
b030: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b040: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b050: 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69  3(v, -1, "rows i
b060: 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41  nserted", P3_STA
b070: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
b080: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b090: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
b0a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
b0b0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  copy_cleanup:.  
b0c0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b0d0: 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   The non-standar
b0e0: 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  d VACUUM command
b0f0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61   is used to clea
b100: 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73  n up the databas
b110: 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66  e,.** collapse f
b120: 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20  ree space, etc. 
b130: 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20   It is modelled 
b140: 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d  after the VACUUM
b150: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50   command.** in P
b160: 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a  ostgreSQL..**.**
b170: 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e   In version 1.0.
b180: 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65  x of SQLite, the
b190: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
b1a0: 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64  would call.** gd
b1b0: 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20  bm_reorganize() 
b1c0: 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62  on all the datab
b1d0: 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74  ase tables.  But
b1e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
b1f0: 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65  th 2.0.0, SQLite
b200: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
b210: 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d  GDBM so this com
b220: 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f  mand has.** beco
b230: 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76  me a no-op..*/.v
b240: 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d  oid sqliteVacuum
b250: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b260: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
b270: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  e){.  /* Do noth
b280: 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
b290: 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
b2a0: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
b2b0: 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  teBeginTransacti
b2c0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
b2d0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
b2e0: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
b2f0: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
b300: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
b310: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
b320: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
b330: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
b340: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
b350: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
b360: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
b370: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
b380: 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ns ) return;.  s
b390: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
b3a0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
b3b0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
b3c0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b   SQLITE_InTrans;
b3d0: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
b3e0: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
b3f0: 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
b400: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
b410: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e  sqliteCommitTran
b420: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
b430: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
b440: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
b450: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
b460: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
b470: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
b480: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
b490: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
b4a0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
b4b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
b4c0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
b4d0: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
b4e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e  ) return;.  db->
b4f0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
b500: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69  _InTrans;.  sqli
b510: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
b520: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64  ion(pParse);.  d
b530: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
b540: 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
b550: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
b560: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
b570: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54   sqliteRollbackT
b580: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
b590: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
b5a0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
b5b0: 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
b5c0: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
b5d0: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
b5e0: 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72  ->pBe==0 ) retur
b5f0: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
b600: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
b610: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
b620: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
b630: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
b640: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20  E_InTrans)==0 ) 
b650: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
b660: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
b670: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
b680: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b690: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
b6a0: 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
b6b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
b6c0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
b6d0: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
b6e0: 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
b6f0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
b700: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
b710: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
b720: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
b730: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
b740: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
b750: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  The operation wi
b760: 6c 6c 20 62 65 20 61 74 6f 6d 69 63 20 69 6e 20  ll be atomic in 
b770: 74 68 65 0a 2a 2a 20 73 65 6e 73 65 20 74 68 61  the.** sense tha
b780: 74 20 69 74 20 77 69 6c 6c 20 65 69 74 68 65 72  t it will either
b790: 20 64 6f 20 69 74 73 20 63 68 61 6e 67 65 73 20   do its changes 
b7a0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 72 20 6e 6f  completely or no
b7b0: 74 20 61 74 0a 2a 2a 20 61 6c 6c 2e 20 20 53 6f  t at.** all.  So
b7c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6e 65   there is not ne
b7d0: 65 64 20 74 6f 20 73 65 74 20 61 20 63 68 65 63  ed to set a chec
b7e0: 6b 70 6f 69 6e 74 20 69 73 20 61 20 74 72 61 6e  kpoint is a tran
b7f0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 6c  saction.** is al
b800: 72 65 61 64 79 20 69 6e 20 65 66 66 65 63 74 2e  ready in effect.
b810: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
b820: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
b830: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
b840: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
b850: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
b860: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
b870: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b880: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
b890: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
b8a0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 20 29  E_InTrans)==0  )
b8b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
b8c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
b8d0: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
b8e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b8f0: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
b900: 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e  Cookie, pParse->
b910: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
b920: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
b930: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
b940: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
b950: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
b960: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
b970: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
b980: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
b990: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
b9a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
b9b0: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 69  The operation mi
b9c0: 67 68 74 20 6e 6f 74 20 62 65 20 61 74 6f 6d 69  ght not be atomi
b9d0: 63 20 69 6e 0a 2a 2a 20 74 68 65 20 73 65 6e 73  c in.** the sens
b9e0: 65 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20  e that an error 
b9f0: 6d 61 79 20 62 65 20 64 69 73 63 6f 76 65 72 65  may be discovere
ba00: 64 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74  d and the operat
ba10: 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 61 62 6f  ion might.** abo
ba20: 72 74 20 61 66 74 65 72 20 73 6f 6d 65 20 63 68  rt after some ch
ba30: 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
ba40: 6d 61 64 65 2e 20 20 49 66 20 77 65 20 61 72 65  made.  If we are
ba50: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 0a   in the middle .
ba60: 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
ba70: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 69 73 20 73  ion, then this s
ba80: 65 74 73 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  ets a checkpoint
ba90: 2e 20 20 49 66 20 77 65 20 61 72 65 20 6e 6f 74  .  If we are not
baa0: 20 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   in.** a transac
bab0: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 72 74  tion, then start
bac0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
bad0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65  */.void sqliteBe
bae0: 67 69 6e 4d 75 6c 74 69 57 72 69 74 65 4f 70 65  ginMultiWriteOpe
baf0: 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
bb00: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
bb10: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  ;.  v = sqliteGe
bb20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bb30: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
bb40: 72 6e 3b 0a 20 20 69 66 28 20 28 70 50 61 72 73  rn;.  if( (pPars
bb50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
bb60: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
bb70: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
bb80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
bb90: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
bba0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
bbb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
bbc0: 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73  ifyCookie, pPars
bbd0: 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e->db->schema_co
bbe0: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  okie, 0);.    pP
bbf0: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
bc00: 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
bc10: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
bc20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65  eAddOp(v, OP_Che
bc30: 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a  ckpoint, 0, 0);.
bc40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
bc50: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
bc60: 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65  concludes an ope
bc70: 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ration that may 
bc80: 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  have changed.** 
bc90: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
bca0: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69  his is a compani
bcb0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42  on function to B
bcc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
bcd0: 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72  on()..** If a tr
bce0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
bcf0: 61 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d  arted, then comm
bd00: 69 74 20 69 74 2e 20 20 49 66 20 61 20 63 68 65  it it.  If a che
bd10: 63 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73  ckpoint was.** s
bd20: 74 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d  tarted then comm
bd30: 69 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64  it that..*/.void
bd40: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
bd50: 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
bd60: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
bd70: 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
bd80: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
bd90: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
bda0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
bdb0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
bdc0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
bdd0: 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68  {.    /* Do Noth
bde0: 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ing */.  }else{.
bdf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
be00: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
be10: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
be20: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
be30: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
be40: 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g as a boolean v
be50: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
be60: 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63  int getBoolean(c
be70: 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69  har *z){.  stati
be80: 63 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d  c char *azTrue[]
be90: 20 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22   = { "yes", "on"
bea0: 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e  , "true" };.  in
beb0: 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d  t i;.  if( z[0]=
bec0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bed0: 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30   if( isdigit(z[0
bee0: 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27  ]) || (z[0]=='-'
bef0: 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d   && isdigit(z[1]
bf00: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
bf10: 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20   atoi(z);.  }.  
bf20: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
bf30: 66 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66  f(azTrue)/sizeof
bf40: 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b  (azTrue[0]); i++
bf50: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
bf60: 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75  eStrICmp(z,azTru
bf70: 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  e[i])==0 ) retur
bf80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
bf90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
bfa0: 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73  ocess a pragma s
bfb0: 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  tatement.  .**.*
bfc0: 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66  * Pragmas are of
bfd0: 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a   this form:.**.*
bfe0: 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64  *      PRAGMA id
bff0: 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54   = value.**.** T
c000: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69  he identifier mi
c010: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74  ght also be a st
c020: 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65  ring.  The value
c030: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e   is a string, an
c040: 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c  d.** identifier,
c050: 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49   or a number.  I
c060: 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74  f minusFlag is t
c070: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61  rue, then the va
c080: 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62  lue is.** a numb
c090: 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63  er that was prec
c0a0: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
c0b0: 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sign..*/.void sq
c0c0: 6c 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65  litePragma(Parse
c0d0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
c0e0: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
c0f0: 52 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73  Right, int minus
c100: 46 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Flag){.  char *z
c110: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Left = 0;.  char
c120: 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *zRight = 0;.  
c130: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
c140: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66  rse->db;..  zLef
c150: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
c160: 70 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66  p(pLeft->z, pLef
c170: 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  t->n);.  sqliteD
c180: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
c190: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
c1a0: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30  {.    zRight = 0
c1b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
c1c0: 53 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20  String(&zRight, 
c1d0: 22 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e  "-", 1, pRight->
c1e0: 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29  z, pRight->n, 0)
c1f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
c200: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74  Right = sqliteSt
c210: 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c  rNDup(pRight->z,
c220: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20   pRight->n);.   
c230: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
c240: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20  Right);.  }. .  
c250: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
c260: 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73  p(zLeft,"cache_s
c270: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
c280: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
c290: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  zRight);.    sql
c2a0: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
c2b0: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 73 69  Size(db->pBe, si
c2c0: 7a 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ze);.  }else..  
c2d0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
c2e0: 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74  p(zLeft, "vdbe_t
c2f0: 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
c300: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
c310: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
c320: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
c330: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a  LITE_VdbeTrace;.
c340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c350: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
c360: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
c370: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
c380: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
c390: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c  Cmp(zLeft, "full
c3a0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d  _column_names")=
c3b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
c3c0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
c3d0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
c3e0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75  ags |= SQLITE_Fu
c3f0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  llColNames;.    
c400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
c410: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
c420: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
c430: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
c440: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
c450: 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c  mp(zLeft, "resul
c460: 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d  t_set_details")=
c470: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
c480: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
c490: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
c4a0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65  ags |= SQLITE_Re
c4b0: 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
c4c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
c4d0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
c4e0: 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73  TE_ResultDetails
c4f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
c500: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
c510: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75  ICmp(zLeft, "cou
c520: 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20  nt_changes")==0 
c530: 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
c540: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
c550: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
c560: 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74   |= SQLITE_Count
c570: 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Rows;.    }else{
c580: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
c590: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e   &= ~SQLITE_Coun
c5a0: 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  tRows;.    }.  }
c5b0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
c5c0: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
c5d0: 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63   "empty_result_c
c5e0: 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b  allbacks")==0 ){
c5f0: 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
c600: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
c610: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
c620: 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c  = SQLITE_NullCal
c630: 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  lback;.    }else
c640: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
c650: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c  s &= ~SQLITE_Nul
c660: 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  lCallback;.    }
c670: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
c680: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
c690: 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f  eft, "table_info
c6a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  ")==0 ){.    Tab
c6b0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64  le *pTab;.    Vd
c6c0: 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20  be *v;.    pTab 
c6d0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
c6e0: 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20  e(db, zRight);. 
c6f0: 20 20 20 69 66 28 20 70 54 61 62 20 29 20 76 20     if( pTab ) v 
c700: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
c710: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
c720: 20 70 54 61 62 20 26 26 20 76 20 29 7b 0a 20 20   pTab && v ){.  
c730: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
c740: 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  p tableInfoPrefa
c750: 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ce[] = {.       
c760: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
c770: 74 2c 20 35 2c 20 30 2c 20 20 20 20 20 20 20 30  t, 5, 0,       0
c780: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
c790: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
c7a0: 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c  0,       "cid"},
c7b0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
c7c0: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
c7d0: 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
c7e0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
c7f0: 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
c800: 20 20 20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20        "type"},. 
c810: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
c820: 6d 6e 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20  mnName,  3, 0,  
c830: 20 20 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c       "notnull"},
c840: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
c850: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c  lumnName,  4, 0,
c860: 20 20 20 20 20 20 20 22 64 66 6c 74 5f 76 61 6c         "dflt_val
c870: 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  ue"},.      };. 
c880: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c890: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c8a0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
c8b0: 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
c8c0: 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
c8d0: 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66  reface);.      f
c8e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
c8f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c900: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c910: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
c920: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
c930: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c940: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
c950: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
c960: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
c970: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61  3(v, -1, pTab->a
c980: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33  Col[i].zName, P3
c990: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
c9a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c9b0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
c9c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
c9d0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
c9e0: 33 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  3(v, -1, .      
c9f0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
ca00: 69 5d 2e 7a 54 79 70 65 20 3f 20 70 54 61 62 2d  i].zType ? pTab-
ca10: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a  >aCol[i].zType :
ca20: 20 22 74 65 78 74 22 2c 20 50 33 5f 53 54 41 54   "text", P3_STAT
ca30: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
ca40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ca50: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
ca60: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
ca70: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  l, 0);.        s
ca80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ca90: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
caa0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
cab0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
cac0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
cad0: 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54  [i].zDflt, P3_ST
cae0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
caf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cb00: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35  , OP_Callback, 5
cb10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
cb20: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
cb30: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
cb40: 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 69  (zLeft, "index_i
cb50: 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfo")==0 ){.    
cb60: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
cb70: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
cb80: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70    Vdbe *v;.    p
cb90: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
cba0: 49 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74  Index(db, zRight
cbb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
cbc0: 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56  ) v = sqliteGetV
cbd0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
cbe0: 20 69 66 28 20 70 49 64 78 20 26 26 20 76 20 29   if( pIdx && v )
cbf0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56  {.      static V
cc00: 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50  dbeOp tableInfoP
cc10: 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20  reface[] = {.   
cc20: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
cc30: 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20  Count, 3, 0,    
cc40: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b     0},.        {
cc50: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
cc60: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65   0, 0,       "se
cc70: 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  qno"},.        {
cc80: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
cc90: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69   1, 0,       "ci
cca0: 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  d"},.        { O
ccb0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
ccc0: 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65  , 0,       "name
ccd0: 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  "},.      };.   
cce0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ccf0: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
cd00: 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
cd10: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
cd20: 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
cd30: 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
cd40: 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
cd50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
cd60: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
cd70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cd80: 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d  int cnum = pIdx-
cd90: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
cda0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
cdb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
cdc0: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
cdd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cde0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
cdf0: 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20  r, cnum, 0);.   
ce00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ce10: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ce20: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
ce30: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
ce40: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
ce50: 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61  ->aCol[cnum].zNa
ce60: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
ce70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
ce80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
ce90: 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20  llback, 3, 0);. 
cea0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ceb0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
cec0: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
ced0: 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d   "index_list")==
cee0: 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
cef0: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
cf00: 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
cf10: 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
cf20: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
cf30: 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
cf40: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
cf50: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
cf60: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
cf70: 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e     pIdx = pTab->
cf80: 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
cf90: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70 49    if( pTab && pI
cfa0: 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  dx && v ){.     
cfb0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
cfc0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
cfd0: 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63   indexListPrefac
cfe0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
cff0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
d000: 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 3, 0,       0}
d010: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
d020: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
d030: 2c 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a  ,       "seq"},.
d040: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
d050: 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
d060: 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
d070: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
d080: 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20  mnName,  2, 0,  
d090: 20 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a       "unique"},.
d0a0: 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
d0b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
d0c0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
d0d0: 28 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63  (indexListPrefac
d0e0: 65 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65  e), indexListPre
d0f0: 66 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69  face);.      whi
d100: 6c 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20  le(pIdx){.      
d110: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d120: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
d130: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
d140: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d150: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d160: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
d170: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d180: 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61  v, -1, pIdx->zNa
d190: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
d1a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
d1b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
d1c0: 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45  teger, pIdx->onE
d1d0: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30  rror!=OE_None, 0
d1e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d1f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d200: 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29  _Callback, 3, 0)
d210: 3b 0a 09 2b 2b 69 3b 0a 09 70 49 64 78 20 3d 20  ;..++i;..pIdx = 
d220: 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pIdx->pNext;.   
d230: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
d240: 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se..#ifndef NDEB
d250: 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  UG.  if( sqliteS
d260: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70  trICmp(zLeft, "p
d270: 61 72 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30  arser_trace")==0
d280: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76   ){.    extern v
d290: 6f 69 64 20 73 71 6c 69 74 65 50 61 72 73 65 72  oid sqliteParser
d2a0: 54 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61  Trace(FILE*, cha
d2b0: 72 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65  r *);.    if( ge
d2c0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
d2d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d2e0: 50 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f  ParserTrace(stdo
d2f0: 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b  ut, "parser: ");
d300: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d310: 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72    sqliteParserTr
d320: 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ace(0, 0);.    }
d330: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
d340: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
d350: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
d360: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 61 6e 69  Cmp(zLeft, "sani
d370: 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b  ty_check")==0 ){
d380: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
d390: 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b  Op checkDb[] = {
d3a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
d3b0: 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20  nsert,   0, 0,  
d3c0: 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20        "2"},.    
d3d0: 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20    { OP_Open,    
d3e0: 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
d3f0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
d400: 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20  Rewind,      0, 
d410: 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  6,        0},.  
d420: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
d430: 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20        0, 3,     
d440: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
d450: 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30  P_SetInsert,   0
d460: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
d470: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
d480: 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20          0, 3,   
d490: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
d4a0: 20 4f 50 5f 53 61 6e 69 74 79 43 68 65 63 6b 2c   OP_SanityCheck,
d4b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
d4c0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
d4d0: 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20  umnCount, 1, 0, 
d4e0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
d4f0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
d500: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
d510: 22 73 61 6e 69 74 79 5f 63 68 65 63 6b 22 7d 2c  "sanity_check"},
d520: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
d530: 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
d540: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
d550: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
d560: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
d570: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
d580: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d590: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d5a0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
d5b0: 65 28 63 68 65 63 6b 44 62 29 2c 20 63 68 65 63  e(checkDb), chec
d5c0: 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  kDb);.  }else.#e
d5d0: 6e 64 69 66 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c  ndif..  {}.  sql
d5e0: 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a  iteFree(zLeft);.
d5f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69    sqliteFree(zRi
d600: 67 68 74 29 3b 0a 7d 0a                          ght);.}.