/ Hex Artifact Content
Login

Artifact 6a27cbfabc956e89cf62358d368524429c1aec9c:


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 34 31 20 32 30 30  ild.c,v 1.41 200
0320: 31 2f 30 39 2f 32 34 20 30 33 3a 31 32 3a 34 30  1/09/24 03:12:40
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 0a 2a 2f 0a 45 78 70 72 20   to it..*/.Expr 
0860: 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e 74 20  *sqliteExpr(int 
0870: 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  op, Expr *pLeft,
0880: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 54   Expr *pRight, T
0890: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
08a0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
08b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
08c0: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29  oc( sizeof(Expr)
08d0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
08e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
08f0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20  pNew->op = op;. 
0900: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0910: 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  Left;.  pNew->pR
0920: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
0930: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
0940: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d     pNew->token =
0950: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73   *pToken;.  }els
0960: 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  e{.    pNew->tok
0970: 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70  en.z = "";.    p
0980: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  New->token.n = 0
0990: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 65 66  ;.  }.  if( pLef
09a0: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
09b0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61     sqliteExprSpa
09c0: 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e  n(pNew, &pLeft->
09d0: 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73  span, &pRight->s
09e0: 70 61 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pan);.  }else{. 
09f0: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
0a00: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 7d  pNew->token;.  }
0a10: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
0a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
0a30: 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c   Expr.token fiel
0a40: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
0a50: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
0a60: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
0a70: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
0a80: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
0a90: 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 53 70  oid sqliteExprSp
0aa0: 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  an(Expr *pExpr, 
0ab0: 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f  Token *pLeft, To
0ac0: 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  ken *pRight){.  
0ad0: 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
0ae0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
0af0: 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 70   pLeft->z;.    p
0b00: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70  Expr->span.n = p
0b10: 52 69 67 68 74 2d 3e 6e 20 2b 20 28 69 6e 74 29  Right->n + (int)
0b20: 70 52 69 67 68 74 2d 3e 7a 20 2d 20 28 69 6e 74  pRight->z - (int
0b30: 29 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 7d 0a 7d  )pLeft->z;.  }.}
0b40: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
0b50: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
0b60: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
0b70: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
0b80: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
0b90: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
0ba0: 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45  teExprFunction(E
0bb0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
0bc0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
0bd0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
0be0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
0bf0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72  loc( sizeof(Expr
0c00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0c10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0c20: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
0c30: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
0c40: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
0c50: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
0c60: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20      pNew->token 
0c70: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c  = *pToken;.  }el
0c80: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  se{.    pNew->to
0c90: 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20  ken.z = "";.    
0ca0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  pNew->token.n = 
0cb0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0cc0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
0cd0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
0ce0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
0cf0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
0d00: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 45  liteExprDelete(E
0d10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
0d20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0d30: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73  if( p->pLeft ) s
0d40: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0d50: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
0d60: 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c   p->pRight ) sql
0d70: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
0d80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20  >pRight);.  if( 
0d90: 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c 69 74  p->pList ) sqlit
0da0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
0db0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69 66 28  p->pList);.  if(
0dc0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71   p->pSelect ) sq
0dd0: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
0de0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
0df0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0e00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0e10: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0e20: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0e30: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 66 6f 72  ribes the.** for
0e40: 6d 61 74 20 6f 66 20 61 20 70 61 72 74 69 63 75  mat of a particu
0e50: 6c 61 72 20 64 61 74 61 62 61 73 65 20 74 61 62  lar database tab
0e60: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
0e70: 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62  e.** of that tab
0e80: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
0e90: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
0ea0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 46  /.Table *sqliteF
0eb0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20  indTable(sqlite 
0ec0: 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65  *db, char *zName
0ed0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
0ee0: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
0ef0: 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  db->tblHash, zNa
0f00: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
0f10: 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  )+1);.  return (
0f20: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 69 73 44 65 6c  p==0 || p->isDel
0f30: 65 74 65 29 20 3f 20 30 20 3a 20 70 3b 0a 7d 0a  ete) ? 0 : p;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
0f50: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
0f60: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
0f70: 69 62 65 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  ibes the.** form
0f80: 61 74 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  at of a particul
0f90: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
0fa0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0fb0: 61 74 20 69 6e 64 65 78 2e 20 20 52 65 74 75 72  at index.  Retur
0fc0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0fd0: 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  und..*/.Index *s
0fe0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 73  qliteFindIndex(s
0ff0: 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72 20  qlite *db, char 
1000: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *zName){.  Index
1010: 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68   *p = sqliteHash
1020: 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48 61 73  Find(&db->idxHas
1030: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
1040: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 72 65  (zName)+1);.  re
1050: 74 75 72 6e 20 28 70 3d 3d 30 20 7c 7c 20 70 2d  turn (p==0 || p-
1060: 3e 69 73 44 65 6c 65 74 65 29 20 3f 20 30 20 3a  >isDelete) ? 0 :
1070: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   p;.}../*.** Rem
1080: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
1090: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
10a0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
10b0: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
10c0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
10d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
10e0: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
10f0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1100: 61 73 68 20 74 61 62 6c 65 20 69 66 20 64 62 21  ash table if db!
1110: 3d 4e 55 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 74  =NULL..** But it
1120: 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64   is not unlinked
1130: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
1140: 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 69 6e  that is being in
1150: 64 65 78 65 64 2e 20 20 0a 2a 2a 20 55 6e 6c 69  dexed.  .** Unli
1160: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
1170: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
1180: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
1190: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
11a0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11b0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
11c0: 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  te *db, Index *p
11d0: 49 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49  Index){.  if( pI
11e0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 64  ndex->zName && d
11f0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48  b ){.    sqliteH
1200: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69  ashInsert(&db->i
1210: 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e  dxHash, pIndex->
1220: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
1230: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
1240: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1250: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 7d 0a  Free(pIndex);.}.
1260: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
1270: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
1280: 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  om its table, th
1290: 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65  en remove.** the
12a0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
12b0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
12c0: 2c 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  , and free its m
12d0: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
12e0: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
12f0: 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b  oid sqliteUnlink
1300: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
1310: 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78  qlite *db, Index
1320: 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28   *pIndex){.  if(
1330: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1340: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
1350: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
1360: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
1370: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
1390: 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  x *p;.    for(p=
13a0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
13b0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
13c0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
13d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
13e0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
13f0: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
1400: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
1410: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
1420: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1430: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1440: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
1450: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
1460: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
1470: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
1480: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
1490: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
14a0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
14b0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
14c0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
14d0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
14e0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
14f0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
1500: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
1510: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
1520: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
1530: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
1540: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
1550: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
1560: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
1570: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
1580: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1590: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73  e..**.** Indices
15a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15b0: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75   the table are u
15c0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
15d0: 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74   "db".** data st
15e0: 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e  ructure if db!=N
15f0: 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c  ULL.  If db==NUL
1600: 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63  L, indices attac
1610: 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  hed to.** the ta
1620: 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ble are deleted,
1630: 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d   but it is assum
1640: 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72  ed they have alr
1650: 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c  eady been.** unl
1660: 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  inked..*/.void s
1670: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
1680: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62  (sqlite *db, Tab
1690: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
16a0: 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70  nt i;.  Index *p
16b0: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
16c0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
16d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16e0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
16f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
1700: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1710: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
1720: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1730: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
1740: 7a 44 66 6c 74 29 3b 0a 20 20 7d 0a 20 20 66 6f  zDflt);.  }.  fo
1750: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
1760: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
1770: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
1780: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
1790: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
17a0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
17b0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
17c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
17d0: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
17e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
17f0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73  able->aCol);.  s
1800: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1810: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
1820: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
1830: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
1840: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
1850: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
1860: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ble structure an
1870: 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  d all its indice
1880: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1890: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
18a0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
18b0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
18c0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 70  pTable){.  if( p
18d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 26 26 20  Table->zName && 
18e0: 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
18f0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1900: 74 62 6c 48 61 73 68 2c 20 70 54 61 62 6c 65 2d  tblHash, pTable-
1910: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
1920: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Table->zName)+1,
1930: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1940: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  eDeleteTable(db,
1950: 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a   pTable);.}../*.
1960: 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20 54 61 62  ** Check all Tab
1970: 6c 65 73 20 61 6e 64 20 49 6e 64 65 78 65 73 20  les and Indexes 
1980: 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  in the internal 
1990: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 63  hash table and c
19a0: 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20 61 64 64  ommit.** any add
19b0: 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65 74 69  itions or deleti
19c0: 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20 68 61 73  ons to those has
19d0: 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  h tables..**.** 
19e0: 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67 20 43  When executing C
19f0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 6e 64 20  REATE TABLE and 
1a00: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1a10: 74 65 6d 65 6e 74 73 2c 20 74 68 65 20 54 61 62  tements, the Tab
1a20: 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64 65 78 20  le.** and Index 
1a30: 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20 63  structures are c
1a40: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
1a50: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
1a60: 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74 68 65 20  les, but.** the 
1a70: 22 69 73 43 6f 6d 6d 69 74 22 20 66 69 65 6c 64  "isCommit" field
1a80: 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 20 54 68   is not set.  Th
1a90: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
1aa0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 2a 2a  those fields..**
1ab0: 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67 20   When executing 
1ac0: 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64 20 44  DROP TABLE and D
1ad0: 52 4f 50 20 49 4e 44 45 58 2c 20 74 68 65 20 22  ROP INDEX, the "
1ae0: 69 73 44 65 6c 65 74 65 22 20 66 69 65 6c 64 73  isDelete" fields
1af0: 20 6f 66 0a 2a 2a 20 54 61 62 6c 65 20 61 6e 64   of.** Table and
1b00: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
1b10: 73 20 69 73 20 73 65 74 20 62 75 74 20 74 68 65  s is set but the
1b20: 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20   structures are 
1b30: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 20  not unlinked.** 
1b40: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
1b50: 62 6c 65 73 20 6e 6f 72 20 64 65 61 6c 6c 6f 63  bles nor dealloc
1b60: 61 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ated.  This rout
1b70: 69 6e 65 20 68 61 6e 64 6c 65 73 20 74 68 61 74  ine handles that
1b80: 0a 2a 2a 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  .** deallocation
1b90: 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
1ba0: 6f 3a 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63  o: sqliteRollbac
1bb0: 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  kInternalChanges
1bc0: 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ().*/.void sqlit
1bd0: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
1be0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
1bf0: 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44 65 6c  b){.  Hash toDel
1c00: 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  ete;.  HashElem 
1c10: 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28 64  *pElem;.  if( (d
1c20: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1c30: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
1c40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1c50: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
1c60: 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49 54 45  toDelete, SQLITE
1c70: 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20 30  _HASH_POINTER, 0
1c80: 29 3b 0a 20 20 64 62 2d 3e 73 63 68 65 6d 61 5f  );.  db->schema_
1c90: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 6e 65 78  cookie = db->nex
1ca0: 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72 28  t_cookie;.  for(
1cb0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
1cc0: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
1cd0: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
1ce0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1cf0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
1d00: 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71  ble *pTable = sq
1d10: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1d20: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
1d30: 62 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  ble->isDelete ){
1d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
1d50: 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65 74  hInsert(&toDelet
1d60: 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20 70 54  e, pTable, 0, pT
1d70: 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
1d80: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
1d90: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
1da0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45    }.  }.  for(pE
1db0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
1dc0: 72 73 74 28 26 74 6f 44 65 6c 65 74 65 29 3b 20  rst(&toDelete); 
1dd0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
1de0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
1df0: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
1e00: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 48  pTable = sqliteH
1e10: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
1e20: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
1e30: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
1e40: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 0a  b, pTable);.  }.
1e50: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1e60: 72 28 26 74 6f 44 65 6c 65 74 65 29 3b 0a 20 20  r(&toDelete);.  
1e70: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
1e80: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 69  HashFirst(&db->i
1e90: 64 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  dxHash); pElem; 
1ea0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
1eb0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
1ec0: 20 20 54 61 62 6c 65 20 2a 70 49 6e 64 65 78 20    Table *pIndex 
1ed0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
1ee0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
1ef0: 20 70 49 6e 64 65 78 2d 3e 69 73 44 65 6c 65 74   pIndex->isDelet
1f00: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1f10: 65 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44  eHashInsert(&toD
1f20: 65 6c 65 74 65 2c 20 70 49 6e 64 65 78 2c 20 30  elete, pIndex, 0
1f30: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  , pIndex);.    }
1f40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64  else{.      pInd
1f50: 65 78 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31  ex->isCommit = 1
1f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
1f70: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
1f80: 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74  shFirst(&toDelet
1f90: 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  e); pElem; pElem
1fa0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1fb0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
1fc0: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
1fd0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1fe0: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
1ff0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2000: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2010: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2020: 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29  Clear(&toDelete)
2030: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
2040: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2050: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2060: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
2070: 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  ns when one or m
2080: 6f 72 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  ore CREATE TABLE
2090: 2c 20 43 52 45 41 54 45 20 49 4e 44 45 58 2c 0a  , CREATE INDEX,.
20a0: 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45 2c 20 6f  ** DROP TABLE, o
20b0: 72 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  r DROP INDEX sta
20c0: 74 65 6d 65 6e 74 73 20 67 65 74 20 72 6f 6c 6c  tements get roll
20d0: 65 64 20 62 61 63 6b 2e 20 20 54 68 65 0a 2a 2a  ed back.  The.**
20e0: 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65   additions or de
20f0: 6c 65 74 69 6f 6e 73 20 6f 66 20 54 61 62 6c 65  letions of Table
2100: 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72 75 63   and Index struc
2110: 74 75 72 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tures in the.** 
2120: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2130: 62 6c 65 73 20 61 72 65 20 75 6e 64 6f 6e 65 2e  bles are undone.
2140: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
2150: 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74   sqliteCommitInt
2160: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a  ernalChanges().*
2170: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c  /.void sqliteRol
2180: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
2190: 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29  nges(sqlite *db)
21a0: 7b 0a 20 20 48 61 73 68 20 74 6f 44 65 6c 65 74  {.  Hash toDelet
21b0: 65 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  e;.  HashElem *p
21c0: 45 6c 65 6d 3b 0a 20 20 69 66 28 20 28 64 62 2d  Elem;.  if( (db-
21d0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
21e0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3d 3d  InternChanges)==
21f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
2200: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 74 6f  liteHashInit(&to
2210: 44 65 6c 65 74 65 2c 20 53 51 4c 49 54 45 5f 48  Delete, SQLITE_H
2220: 41 53 48 5f 50 4f 49 4e 54 45 52 2c 20 30 29 3b  ASH_POINTER, 0);
2230: 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  .  db->next_cook
2240: 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f  ie = db->schema_
2250: 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f 72 28 70 45  cookie;.  for(pE
2260: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2270: 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68  rst(&db->tblHash
2280: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2290: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
22a0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
22b0: 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  e *pTable = sqli
22c0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
22d0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
22e0: 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  le->isCommit ){.
22f0: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
2300: 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65 74 65  Insert(&toDelete
2310: 2c 20 70 54 61 62 6c 65 2c 20 30 2c 20 70 54 61  , pTable, 0, pTa
2320: 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ble);.    }else{
2330: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 69  .      pTable->i
2340: 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  sDelete = 0;.   
2350: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c   }.  }.  for(pEl
2360: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2370: 73 74 28 26 74 6f 44 65 6c 65 74 65 29 3b 20 70  st(&toDelete); p
2380: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2390: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
23a0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
23b0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 48 61  Table = sqliteHa
23c0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
23d0: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
23e0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
23f0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  , pTable);.  }. 
2400: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
2410: 28 26 74 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66  (&toDelete);.  f
2420: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2430: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 69 64  ashFirst(&db->id
2440: 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  xHash); pElem; p
2450: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
2460: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
2470: 20 54 61 62 6c 65 20 2a 70 49 6e 64 65 78 20 3d   Table *pIndex =
2480: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
2490: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
24a0: 21 70 49 6e 64 65 78 2d 3e 69 73 43 6f 6d 6d 69  !pIndex->isCommi
24b0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
24c0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44  eHashInsert(&toD
24d0: 65 6c 65 74 65 2c 20 70 49 6e 64 65 78 2c 20 30  elete, pIndex, 0
24e0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  , pIndex);.    }
24f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64  else{.      pInd
2500: 65 78 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 30  ex->isDelete = 0
2510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2520: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2530: 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74  shFirst(&toDelet
2540: 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  e); pElem; pElem
2550: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2560: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
2570: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2580: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2590: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
25a0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
25b0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
25c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
25d0: 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29  Clear(&toDelete)
25e0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
25f0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2600: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2610: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e   Construct the n
2620: 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61  ame of a user ta
2630: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f  ble or index fro
2640: 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  m a token..**.**
2650: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2660: 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  he name is obtai
2670: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
2680: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
2690: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
26a0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
26b0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
26c0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
26d0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
26e0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
26f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
2700: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
2710: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
2720: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
2730: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
2750: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
2760: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
2770: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
2780: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
2790: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
27a0: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
27b0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
27c0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
27d0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
27e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
27f0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
2800: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2810: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
2820: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
2830: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
2840: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
2850: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
2860: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
2870: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
2880: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
2890: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e name..**.** Th
28a0: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63  e new table is c
28b0: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 66 69  onstructed in fi
28c0: 6c 65 73 20 6f 66 20 74 68 65 20 70 50 61 72 73  les of the pPars
28d0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 73  e structure.  As
28e0: 0a 2a 2a 20 6d 6f 72 65 20 6f 66 20 74 68 65 20  .** more of the 
28f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
2900: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2910: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
2920: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
2930: 61 72 65 20 63 61 6c 6c 65 64 20 74 6f 20 62 75  are called to bu
2940: 69 6c 64 20 75 70 20 6d 6f 72 65 20 6f 66 20 74  ild up more of t
2950: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  he table..*/.voi
2960: 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62  d sqliteStartTab
2970: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
2980: 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c  , Token *pStart,
2990: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
29a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
29b0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
29c0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
29d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 70 50  Parse->db;..  pP
29e0: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
29f0: 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a  n = *pStart;.  z
2a00: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
2a10: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
2a20: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
2a30: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
2a40: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
2a50: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
2a60: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
2a70: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 73  able!=0 ){.    s
2a80: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2a90: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
2aa0: 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70  , "table ", 0, p
2ab0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
2ac0: 6e 2c 0a 20 20 20 20 20 20 20 20 22 20 61 6c 72  n,.        " alr
2ad0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 2c  eady exists", 0,
2ae0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
2af0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
2b00: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
2b10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2b20: 20 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64    if( sqliteFind
2b30: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
2b40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
2b50: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
2b60: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65  >zErrMsg, "there
2b70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
2b80: 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20  ndex named ", . 
2b90: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b        zName, 0);
2ba0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2bb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72  zName);.    pPar
2bc0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
2bd0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
2be0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  able = sqliteMal
2bf0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
2c00: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
2c10: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
2c20: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
2c30: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
2c40: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->nCol = 0;.  p
2c50: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
2c60: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
2c70: 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  x = 0;.  if( pPa
2c80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
2c90: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
2ca0: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  le(db, pParse->p
2cb0: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
2cc0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
2cd0: 20 70 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 21   pTable;.  if( !
2ce0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
2cf0: 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
2d00: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
2d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
2d20: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
2d30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
2d40: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73  if( v ){.      s
2d50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2d60: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
2d70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
2d80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
2d90: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
2da0: 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68  yCookie, db->sch
2db0: 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 2c 20 30  ema_cookie, 0, 0
2dc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
2dd0: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
2de0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
2df0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2e00: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
2e10: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
2e20: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
2e30: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
2e40: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
2e50: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
2e60: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
2e70: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
2e80: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
2e90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
2ea0: 74 65 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  teStartTable() g
2eb0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
2ec0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
2ed0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
2ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ef0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
2f00: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
2f10: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
2f20: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2f30: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
2f40: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 68    Table *p;.  ch
2f50: 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  ar **pz;.  if( (
2f60: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
2f70: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
2f80: 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43  rn;.  if( (p->nC
2f90: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
2fa0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 73 71      p->aCol = sq
2fb0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
2fc0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
2fd0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
2fe0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
2ff0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->aCol==0 ){.   
3000: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a     p->nCol = 0;.
3010: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3020: 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74    }.  }.  memset
3030: 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  (&p->aCol[p->nCo
3040: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  l], 0, sizeof(p-
3050: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 7a  >aCol[0]));.  pz
3060: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
3070: 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col++].zName;.  
3080: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3090: 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  (pz, pName->z, p
30a0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 73  Name->n, 0);.  s
30b0: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
30c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
30d0: 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74  given token is t
30e0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
30f0: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f   for the last co
3100: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a  lumn added to.**
3110: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
3120: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
3130: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69  ruction.  If "mi
3140: 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65  nusFlag" is true
3150: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
3160: 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61  e value token wa
3170: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
3180: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
3190: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
31a0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
31b0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
31c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
31d0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
31e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
31f0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
3200: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
3210: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3220: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
3230: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
3240: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
3250: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
3260: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
3270: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
3280: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
3290: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 70 7a 20  p->nCol-1;.  pz 
32a0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
32b0: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
32c0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
32d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
32e0: 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a   "-", 1, pVal->z
32f0: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
3300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
3310: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
3320: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
3330: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n, 0);.  }.  sql
3340: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
3350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75  .}../*.** Come u
3360: 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e  p with a new ran
3370: 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  dom value for th
3380: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
3390: 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74    Make sure.** t
33a0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
33b0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
33c0: 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  he old..**.** Th
33d0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
33e0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
33f0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
3400: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
3410: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
3420: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
3430: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
3440: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
3450: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
3460: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
3470: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
3480: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
3490: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
34a0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
34b0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
34c0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
34d0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
34e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
34f0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
3500: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
3510: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
3520: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
3530: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
3540: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
3550: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
3560: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
3570: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
3580: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
3590: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
35a0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
35b0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
35c0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
35d0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
35e0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
35f0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
3600: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
3610: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
3620: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
3630: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
3640: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
3650: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 73 74  fe enough..*/.st
3660: 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65  atic void change
3670: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64  Cookie(sqlite *d
3680: 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  b){.  if( db->ne
3690: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73  xt_cookie==db->s
36a0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
36b0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
36c0: 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61  kie = db->schema
36d0: 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65  _cookie + sqlite
36e0: 52 61 6e 64 6f 6d 42 79 74 65 28 64 62 29 20 2b  RandomByte(db) +
36f0: 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   1;.    db->flag
3700: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
3710: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
3720: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3730: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
3740: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
3750: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
3760: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
3770: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3780: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
3790: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ble structure is
37a0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
37b0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
37c0: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  es.  .**.** An e
37d0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
37e0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
37f0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
3800: 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73  n disk,.** unles
3810: 73 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20  s initFlag==1.  
3820: 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31  When initFlag==1
3830: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  , it means we ar
3840: 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20 74 68 65  e reading.** the
3850: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65   master table be
3860: 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 6f  cause we just co
3870: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
3880: 61 74 61 62 61 73 65 2c 20 73 6f 20 0a 2a 2a 20  atabase, so .** 
3890: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
38a0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
38b0: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 6d   exists in the m
38c0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2a 20  aster table..** 
38d0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
38e0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
38f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3900: 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  eEndTable(Parse 
3910: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
3920: 70 45 6e 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a  pEnd){.  Table *
3930: 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  p;.  sqlite *db 
3940: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
3950: 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 7c 7c 20   if( pEnd==0 || 
3960: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
3970: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
3980: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
3990: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
39a0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
39b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
39c0: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
39d0: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
39e0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
39f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3a00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
3a10: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29  se->explain==0 )
3a20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  {.    sqliteHash
3a30: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
3a40: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
3a50: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
3a60: 31 2c 20 70 29 3b 0a 20 20 20 20 70 50 61 72 73  1, p);.    pPars
3a70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
3a80: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
3a90: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
3aa0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
3ab0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
3ac0: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
3ad0: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
3ae0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
3af0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
3b00: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
3b10: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
3b20: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
3b30: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
3b40: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
3b50: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
3b60: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
3b70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
3b80: 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70 50  rom the .  ** pP
3b90: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
3ba0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
3bb0: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68 61  number should ha
3bc0: 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a 2a  ve been put.  **
3bd0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
3be0: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
3bf0: 6e 65 2e 29 20 20 49 66 20 74 68 65 20 74 61 62  ne.)  If the tab
3c00: 6c 65 20 68 61 73 20 61 20 70 72 69 6d 61 72 79  le has a primary
3c10: 0a 20 20 2a 2a 20 6b 65 79 2c 20 74 68 65 20 72  .  ** key, the r
3c20: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
3c30: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
3c40: 20 77 69 74 68 20 74 68 65 20 70 72 69 6d 61 72   with the primar
3c50: 79 20 6b 65 79 0a 20 20 2a 2a 20 73 68 6f 75 6c  y key.  ** shoul
3c60: 64 20 62 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  d be in pParse->
3c70: 6e 65 77 4b 6e 75 6d 2e 0a 20 20 2a 2f 0a 20 20  newKnum..  */.  
3c80: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
3c90: 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74  Flag ){.    p->t
3ca0: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
3cb0: 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70  wTnum;.    if( p
3cc0: 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
3cd0: 20 20 70 2d 3e 70 49 6e 64 65 78 2d 3e 74 6e 75    p->pIndex->tnu
3ce0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 4b  m = pParse->newK
3cf0: 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
3d00: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
3d10: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
3d20: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
3d30: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
3d40: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
3d50: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
3d60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3d70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
3d80: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
3d90: 7b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 62 61 73  {.    int n, bas
3da0: 65 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  e;.    Vdbe *v;.
3db0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47  .    v = sqliteG
3dc0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
3dd0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
3de0: 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 28  eturn;.    n = (
3df0: 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69  int)pEnd->z - (i
3e00: 6e 74 29 70 50 61 72 73 65 2d 3e 73 46 69 72 73  nt)pParse->sFirs
3e10: 74 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20  tToken.z + 1;.  
3e20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3e30: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3e40: 65 2c 20 30 2c 20 32 2c 20 4d 41 53 54 45 52 5f  e, 0, 2, MASTER_
3e50: 4e 41 4d 45 2c 20 30 29 3b 0a 20 20 20 20 73 71  NAME, 0);.    sq
3e60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3e70: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
3e80: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
3e90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3ea0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
3eb0: 30 2c 20 22 74 61 62 6c 65 22 2c 20 30 29 3b 0a  0, "table", 0);.
3ec0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3ed0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3ee0: 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  , 0, 0, p->zName
3ef0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3f00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3f10: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d  String, 0, 0, p-
3f20: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
3f30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3f40: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
3f50: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  e, 0, 0, 0, 0);.
3f60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 54 61      sqliteVdbeTa
3f70: 62 6c 65 52 6f 6f 74 41 64 64 72 28 76 2c 20 26  bleRootAddr(v, &
3f80: 70 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66  p->tnum);.    if
3f90: 28 20 70 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  ( p->pIndex ){. 
3fa0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
3fb0: 61 62 6c 65 20 68 61 73 20 61 20 70 72 69 6d 61  able has a prima
3fc0: 72 79 20 6b 65 79 2c 20 63 72 65 61 74 65 20 61  ry key, create a
3fd0: 6e 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 64  n index in the d
3fe0: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
3ff0: 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e   for that key an
4000: 64 20 72 65 63 6f 72 64 20 74 68 65 20 72 6f 6f  d record the roo
4010: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 69 6e  t page of the in
4020: 64 65 78 20 69 6e 20 74 68 65 20 22 6b 6e 75 6d  dex in the "knum
4030: 22 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  ".      ** colum
4040: 6e 20 6f 66 20 6f 66 20 74 68 65 20 53 51 4c 49  n of of the SQLI
4050: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
4060: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4070: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
4080: 70 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  p->pIndex;.     
4090: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
40a0: 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  >pNext==0 );.   
40b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
40c0: 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 3b 0a 20 20  x->tnum==0 );.  
40d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
40e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
40f0: 49 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 2c 20  Index, 0, 0, 0, 
4100: 30 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0),.      sqlite
4110: 56 64 62 65 49 6e 64 65 78 52 6f 6f 74 41 64 64  VdbeIndexRootAdd
4120: 72 28 76 2c 20 26 70 49 6e 64 65 78 2d 3e 74 6e  r(v, &pIndex->tn
4130: 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  um);.    }else{.
4140: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
4150: 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 68  table does not h
4160: 61 76 65 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ave a primary ke
4170: 79 2c 20 74 68 65 20 22 6b 6e 75 6d 22 20 63 6f  y, the "knum" co
4180: 6c 75 6d 6e 20 69 73 20 0a 20 20 20 20 20 20 2a  lumn is .      *
4190: 2a 20 66 69 6c 6c 20 77 69 74 68 20 61 20 4e 55  * fill with a NU
41a0: 4c 4c 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20  LL value..      
41b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
41c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
41d0: 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  ull, 0, 0, 0, 0)
41e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65  ;.    }.    base
41f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
4200: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
4210: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
4220: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4230: 67 65 50 33 28 76 2c 20 62 61 73 65 2c 20 70 50  geP3(v, base, pP
4240: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
4250: 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  n.z, n);.    sql
4260: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4270: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 36  OP_MakeRecord, 6
4280: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4290: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
42a0: 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20 30 2c  v, OP_Put, 0, 0,
42b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 63 68 61 6e   0, 0);.    chan
42c0: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
42d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
42e0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
42f0: 65 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  e, db->next_cook
4300: 69 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ie, 0, 0, 0);.  
4310: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4320: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
4330: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4340: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
4350: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
4360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4370: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4380: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  OP_Commit, 0, 0,
4390: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
43a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
43b0: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
43c0: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
43d0: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
43e0: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
43f0: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
4400: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
4410: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
4420: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
4430: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
4440: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
4450: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20   Token *pTok){. 
4460: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
4470: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a  Table *pTab;.  z
4480: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
4490: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
44a0: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
44b0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
44c0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
44d0: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
44e0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
44f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4500: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
4510: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
4520: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
4530: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
4540: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
4550: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d  , .        pTok-
4560: 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b  >z, pTok->n, 0);
4570: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
4580: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
4590: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
45a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
45b0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
45c0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
45d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
45e0: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
45f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
4600: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
4610: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4620: 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
4630: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
4640: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
4650: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65   *pTable;.  Vdbe
4660: 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b   *v;.  int base;
4670: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
4680: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
4690: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
46a0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
46b0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
46c0: 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ;.  pTable = sql
46d0: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
46e0: 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29  n(pParse, pName)
46f0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
4700: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
4710: 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e  ( pTable->readOn
4720: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
4730: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4740: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
4750: 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  le ", pTable->zN
4760: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d  ame, .       " m
4770: 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
4780: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
4790: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
47a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
47b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
47c0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
47d0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
47e0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
47f0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
4800: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
4810: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
4820: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
4830: 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65  VdbeOp dropTable
4840: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
4850: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c  P_OpenWrite,  0,
4860: 20 32 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45   2,        MASTE
4870: 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b  R_NAME},.      {
4880: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
4890: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
48a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
48b0: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
48c0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f       0}, /* 2 */
48d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
48e0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
48f0: 39 29 2c 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f  9),  0}, /* 3 */
4900: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c  .      { OP_Dup,
4910: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
4920: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
4930: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
4940: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
4950: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
4960: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
4970: 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  3),  0},.      {
4980: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
4990: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
49a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
49b0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
49c0: 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  3),  0},.      {
49d0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 20 20 20   OP_Destroy,    
49e0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
49f0: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 9 */.      {
4a00: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
4a10: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
4a20: 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20   /* 10 */.      
4a30: 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20  { OP_Close,     
4a40: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
4a50: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64  ,.    };.    Ind
4a60: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 66  ex *pIdx;.    if
4a70: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
4a80: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
4a90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4aa0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4ab0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
4ac0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
4ad0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ae0: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
4af0: 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f  kie, db->schema_
4b00: 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30 29  cookie, 0, 0, 0)
4b10: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4b20: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
4b30: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 61   1;.    }.    ba
4b40: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
4b50: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
4b60: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
4b70: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
4b80: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4b90: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20  geP3(v, base+2, 
4ba0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
4bb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
4bc0: 65 43 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73  eChangeP1(v, bas
4bd0: 65 2b 39 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75  e+9, pTable->tnu
4be0: 6d 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 43 6f  m);.    changeCo
4bf0: 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 73 71  okie(db);.    sq
4c00: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31  liteVdbeChangeP1
4c10: 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64 62 2d  (v, base+10, db-
4c20: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20  >next_cookie);. 
4c30: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
4c40: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  le->pIndex; pIdx
4c50: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
4c60: 78 74 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt){.      sqlit
4c70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4c80: 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e  _Destroy, pIdx->
4c90: 74 6e 75 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tnum, 0, 0, 0);.
4ca0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 64      }.    if( (d
4cb0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4cc0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
4cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4ce0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
4cf0: 6d 69 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  mit, 0, 0, 0, 0)
4d00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
4d10: 2a 20 4d 61 72 6b 20 74 68 65 20 69 6e 2d 6d 65  * Mark the in-me
4d20: 6d 6f 72 79 20 54 61 62 6c 65 20 73 74 72 75 63  mory Table struc
4d30: 74 75 72 65 20 61 73 20 62 65 69 6e 67 20 64 65  ture as being de
4d40: 6c 65 74 65 64 2e 20 20 54 68 65 20 61 63 74 75  leted.  The actu
4d50: 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 69  ally.  ** deleti
4d60: 6f 6e 20 6f 63 63 75 72 73 20 69 6e 73 69 64 65  on occurs inside
4d70: 20 6f 66 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74   of sqliteCommit
4d80: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
4d90: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  )..  **.  ** Exc
4da0: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
4db0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
4dc0: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
4dd0: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
4de0: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
4df0: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
4e00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
4e10: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
4e20: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 69 73 44  .    pTable->isD
4e30: 65 6c 65 74 65 20 3d 20 31 3b 0a 20 20 20 20 64  elete = 1;.    d
4e40: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4e50: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4e60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
4e70: 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
4e80: 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
4e90: 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
4ea0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
4eb0: 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
4ec0: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
4ed0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
4ee0: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
4ef0: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
4f00: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
4f10: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
4f20: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 75 73 65  n that case, use
4f30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4f40: 6c 65 20 61 73 20 74 68 65 20 0a 2a 2a 20 74 61  le as the .** ta
4f50: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
4f60: 64 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  d..**.** pList i
4f70: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
4f80: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
4f90: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
4fa0: 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a  e NULL if the.**
4fb0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
4fc0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
4fd0: 68 65 20 74 61 62 6c 65 20 69 73 20 6c 61 62 65  he table is labe
4fe0: 6c 65 64 20 61 73 20 74 68 65 20 70 72 69 6d 61  led as the prima
4ff0: 72 79 20 6b 65 79 2e 0a 2a 2f 0a 76 6f 69 64 20  ry key..*/.void 
5000: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
5010: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
5020: 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  se,   /* All inf
5030: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
5040: 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
5050: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
5060: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
5070: 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55  ndex.  May be NU
5080: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
5090: 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  Table,   /* Name
50a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
50b0: 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61   index.  Use pPa
50c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
50d0: 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  f 0 */.  IdList 
50e0: 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
50f0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
5100: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
5110: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
5120: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
5130: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
5140: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
5150: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
5160: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
5170: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
5180: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
5190: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
51a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
51b0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
51c0: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
51d0: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
51e0: 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65  pIndex;   /* The
51f0: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
5200: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
5210: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
5220: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
5230: 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
5240: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
5250: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
5260: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
5270: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
5280: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
5290: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
52a0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
52b0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
52c0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
52d0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
52e0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
52f0: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
5300: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
5310: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  */.  if( pTable!
5320: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
5330: 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( pName!=0 );.  
5340: 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65    pTab =  sqlite
5350: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
5360: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
5370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5380: 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
5390: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
53a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
53b0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
53c0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
53d0: 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
53e0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
53f0: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
5400: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
5410: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
5420: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
5430: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
5440: 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f   .      " may no
5450: 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63  t have new indic
5460: 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20  es added", 0);. 
5470: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5480: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
5490: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
54a0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
54b0: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
54c0: 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
54d0: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
54e0: 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
54f0: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
5500: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
5510: 61 6d 65 20 6e 61 6d 65 2e 20 20 49 66 20 70 4e  ame name.  If pN
5520: 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
5530: 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
5540: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
5550: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 77 68 69  primary key, whi
5560: 63 68 20 68 61 73 20 6e 6f 20 6e 61 6d 65 2c 20  ch has no name, 
5570: 73 6f 20 74 68 69 73 20 73 74 65 70 20 63 61 6e  so this step can
5580: 20 62 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64   be.  ** skipped
5590: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
55a0: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
55b0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
55c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
55d0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
55e0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
55f0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
5600: 20 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64    if( sqliteFind
5610: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
5620: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5630: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
5640: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
5650: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
5660: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
5670: 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20   exists", 0);.  
5680: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5690: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ++;.      goto e
56a0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
56b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
56c0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
56d0: 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  db, zName) ){.  
56e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
56f0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
5700: 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20  rMsg, "there is 
5710: 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
5720: 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20  named ",.       
5730: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
5740: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5750: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  +;.      goto ex
5760: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
5770: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5780: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5790: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
57a0: 6e 67 28 26 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ng(&zName, pTab-
57b0: 3e 7a 4e 61 6d 65 2c 20 22 20 28 70 72 69 6d 61  >zName, " (prima
57c0: 72 79 20 6b 65 79 29 22 2c 20 30 29 3b 0a 20 20  ry key)", 0);.  
57d0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
57e0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
57f0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
5800: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
5810: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
5820: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
5830: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
5840: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
5850: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
5860: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
5870: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
5880: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
5890: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
58a0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
58b0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
58c0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
58d0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
58e0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
58f0: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
5900: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
5910: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
5920: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5930: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
5940: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
5950: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
5960: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
5970: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
5980: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
5990: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
59a0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
59b0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
59c0: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
59d0: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
59e0: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
5a00: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
5a10: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
5a20: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
5a30: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
5a40: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
5a50: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
5a60: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
5a70: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
5a80: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
5a90: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
5aa0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
5ab0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
5ac0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
5ad0: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
5ae0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
5af0: 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a 20  ist->nId;..  /* 
5b00: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
5b10: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
5b20: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
5b30: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
5b40: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
5b50: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
5b60: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
5b70: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
5b80: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
5b90: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
5ba0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
5bb0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
5bc0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
5bd0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
5be0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
5bf0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
5c00: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
5c10: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
5c20: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
5c30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5c40: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
5c50: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
5c60: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
5c70: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
5c80: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
5c90: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
5ca0: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
5cb0: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
5cc0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
5cd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5ce0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
5cf0: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
5d00: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
5d10: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
5d20: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
5d30: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
5d40: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
5d50: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
5d60: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
5d70: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
5d80: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
5d90: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
5da0: 63 74 75 72 65 73 2e 20 20 4e 6f 74 65 20 74 68  ctures.  Note th
5db0: 61 74 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  at primary key i
5dc0: 6e 64 69 63 65 73 0a 20 20 2a 2a 20 64 6f 20 6e  ndices.  ** do n
5dd0: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
5de0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
5df0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
5e00: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
5e10: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d   ){.    if( pNam
5e20: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  e!=0 ){.      ch
5e30: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
5e40: 65 78 2d 3e 7a 4e 61 6d 65 3b 3b 0a 20 20 20 20  ex->zName;;.    
5e50: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
5e60: 72 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c  rt(&db->idxHash,
5e70: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
5e80: 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
5e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
5ea0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
5eb0: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
5ec0: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
5ed0: 64 65 78 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  dex;.    db->fla
5ee0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
5ef0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
5f00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
5f10: 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65  tFlag is 1 it me
5f20: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
5f30: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
5f40: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
5f50: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
5f60: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
5f70: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
5f80: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
5f90: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
5fa0: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72   table number fr
5fb0: 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  om the pParse->n
5fc0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20  ewTnum field..  
5fd0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
5fe0: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
5ff0: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
6000: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b  pParse->newTnum;
6010: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
6020: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20  e initFlag is 0 
6030: 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
6040: 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
6050: 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
6060: 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
6070: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
6080: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
6090: 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
60a0: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
60b0: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
60c0: 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
60d0: 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61 67   ** The initFlag
60e0: 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
60f0: 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
6100: 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
6110: 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
6120: 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  The initFlag is 
6130: 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
6140: 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
6150: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
6160: 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
6170: 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
6180: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
6190: 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
61a0: 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
61b0: 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
61c0: 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
61d0: 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
61e0: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
61f0: 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
6200: 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d    ** If pTable==
6210: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
6220: 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
6230: 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
6240: 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 6f  key.  ** and tho
6250: 73 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  se does not have
6260: 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
6270: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 61 64 64  statement to add
6280: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73   to the.  ** mas
6290: 74 65 72 20 74 61 62 6c 65 2e 20 20 41 6c 73 6f  ter table.  Also
62a0: 2c 20 73 69 6e 63 65 20 70 72 69 6d 61 72 79 20  , since primary 
62b0: 6b 65 79 73 20 61 72 65 20 63 72 65 61 74 65 64  keys are created
62c0: 20 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20 2a   at the same.  *
62d0: 2a 20 74 69 6d 65 20 61 73 20 74 61 62 6c 65 73  * time as tables
62e0: 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c  , the table will
62f0: 20 62 65 20 65 6d 70 74 79 20 73 6f 20 74 68 65   be empty so the
6300: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6310: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
6320: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 48 65 6e   the index.  Hen
6330: 63 65 2c 20 73 6b 69 70 20 61 6c 6c 20 74 68 65  ce, skip all the
6340: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
6350: 20 69 66 0a 20 20 2a 2a 20 70 54 61 62 6c 65 3d   if.  ** pTable=
6360: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  =0..  */.  else 
6370: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
6380: 46 6c 61 67 3d 3d 30 20 26 26 20 70 54 61 62 6c  Flag==0 && pTabl
6390: 65 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e!=0 ){.    stat
63a0: 69 63 20 56 64 62 65 4f 70 20 61 64 64 54 61 62  ic VdbeOp addTab
63b0: 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  le[] = {.      {
63c0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20   OP_OpenWrite,  
63d0: 20 32 2c 20 32 2c 20 4d 41 53 54 45 52 5f 4e 41   2, 2, MASTER_NA
63e0: 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  ME},.      { OP_
63f0: 4e 65 77 52 65 63 6e 6f 2c 20 20 20 20 32 2c 20  NewRecno,    2, 
6400: 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  0, 0},.      { O
6410: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30  P_String,      0
6420: 2c 20 30 2c 20 22 69 6e 64 65 78 22 7d 2c 0a 20  , 0, "index"},. 
6430: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
6440: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c  ,      0, 0, 0},
6450: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
6460: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
6470: 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20    0, 0, 0},  /* 
6480: 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  4 */.      { OP_
6490: 43 72 65 61 74 65 49 6e 64 65 78 2c 20 31 2c 20  CreateIndex, 1, 
64a0: 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  0, 0},.      { O
64b0: 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20 30  P_Dup,         0
64c0: 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  , 0, 0},.      {
64d0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20   OP_OpenWrite,  
64e0: 20 31 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 37   1, 0, 0},  /* 7
64f0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
6500: 75 6c 6c 2c 20 20 20 20 20 20 20 20 30 2c 20 30  ull,        0, 0
6510: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
6520: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
6530: 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 39 20 2a 2f   0, 0},  /* 9 */
6540: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65  .      { OP_Make
6550: 52 65 63 6f 72 64 2c 20 20 36 2c 20 30 2c 20 30  Record,  6, 0, 0
6560: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 50 75  },.      { OP_Pu
6570: 74 2c 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c  t,         2, 0,
6580: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
6590: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 30 2c 20  SetCookie,   0, 
65a0: 30 2c 20 30 7d 2c 20 20 2f 2a 20 31 32 20 2a 2f  0, 0},  /* 12 */
65b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
65c0: 65 2c 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30  e,       2, 0, 0
65d0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
65e0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
65f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6600: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
6610: 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  lbl2;.    int i;
6620: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
6630: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
6640: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
6650: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
6660: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
6670: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 28 64 62  pTable!=0 && (db
6680: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6690: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
66a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
66b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
66c0: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  saction, 0, 0, 0
66d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
66e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
66f0: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
6700: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
6710: 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
6720: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
6730: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
6740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
6750: 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
6760: 20 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20       int base;. 
6770: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 70 45       n = (int)pE
6780: 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 53 74  nd->z - (int)pSt
6790: 61 72 74 2d 3e 7a 20 2b 20 31 3b 0a 20 20 20 20  art->z + 1;.    
67a0: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
67b0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
67c0: 41 72 72 61 79 53 69 7a 65 28 61 64 64 54 61 62  ArraySize(addTab
67d0: 6c 65 29 2c 20 61 64 64 54 61 62 6c 65 29 3b 0a  le), addTable);.
67e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
67f0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
6800: 2b 33 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +3, pIndex->zNam
6810: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
6820: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6830: 76 2c 20 62 61 73 65 2b 34 2c 20 70 54 61 62 2d  v, base+4, pTab-
6840: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
6850: 20 20 73 71 6c 69 74 65 56 64 62 65 49 6e 64 65    sqliteVdbeInde
6860: 78 52 6f 6f 74 41 64 64 72 28 76 2c 20 26 70 49  xRootAddr(v, &pI
6870: 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  ndex->tnum);.   
6880: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6890: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 37 2c  ngeP3(v, base+7,
68a0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
68b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
68c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
68d0: 62 61 73 65 2b 39 2c 20 70 53 74 61 72 74 2d 3e  base+9, pStart->
68e0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 63 68 61  z, n);.      cha
68f0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20  ngeCookie(db);. 
6900: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6910: 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b  hangeP1(v, base+
6920: 31 32 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  12, db->next_coo
6930: 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kie);.    }.    
6940: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6950: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 30 2c 20 70  v, OP_Open, 0, p
6960: 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  Tab->tnum, pTab-
6970: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
6980: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
6990: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
69a0: 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65     lbl2 = sqlite
69b0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
69c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
69d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
69e0: 6e 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  nd, 0, 0, 0, 0);
69f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6a00: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
6a10: 20 30 2c 20 6c 62 6c 32 2c 20 30 2c 20 6c 62 6c   0, lbl2, 0, lbl
6a20: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  1);.    sqliteVd
6a30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
6a40: 63 6e 6f 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  cno, 0, 0, 0, 0)
6a50: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6a60: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
6a70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6a80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6a90: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 70   OP_Column, 0, p
6aa0: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
6ab0: 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  i], 0, 0);.    }
6ac0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
6ae0: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
6af0: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29  Column, 0, 0, 0)
6b00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6b10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
6b20: 64 78 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b  dx, 1, 0, 0, 0);
6b30: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6b40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
6b50: 20 30 2c 20 6c 62 6c 31 2c 20 30 2c 20 30 29 3b   0, lbl1, 0, 0);
6b60: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6b70: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
6b80: 20 30 2c 20 30 2c 20 30 2c 20 6c 62 6c 32 29 3b   0, 0, 0, lbl2);
6b90: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6ba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
6bb0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 1, 0, 0, 0);. 
6bc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6bd0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
6be0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
6bf0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26   if( pTable!=0 &
6c00: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
6c10: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
6c20: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6c30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6c40: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30  _Commit, 0, 0, 0
6c50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
6c60: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 6d 65  .  /* Reclaim me
6c70: 6d 6f 72 79 20 6f 6e 20 61 6e 20 45 58 50 4c 41  mory on an EXPLA
6c80: 49 4e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  IN call..  */.  
6c90: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
6ca0: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
6cb0: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
6cc0: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
6cd0: 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
6ce0: 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
6cf0: 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49  index:.  sqliteI
6d00: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
6d10: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
6d20: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
6d30: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
6d40: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
6d50: 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
6d60: 61 6d 65 64 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  amed index..*/.v
6d70: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e  oid sqliteDropIn
6d80: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
6d90: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
6da0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
6db0: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  x;.  char *zName
6dc0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
6dd0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
6de0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
6df0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
6e00: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
6e10: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
6e20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
6e30: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
6e40: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
6e50: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
6e60: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
6e70: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
6e80: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
6e90: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
6ea0: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
6eb0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
6ec0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
6ed0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
6ee0: 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20   index: ", 0, . 
6ef0: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c         pName->z,
6f00: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
6f10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6f20: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
6f30: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
6f40: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
6f50: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
6f60: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
6f70: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
6f80: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
6f90: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
6fa0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
6fb0: 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20  p dropIndex[] = 
6fc0: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  {.      { OP_Ope
6fd0: 6e 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20  nWrite,  0, 2,  
6fe0: 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45       MASTER_NAME
6ff0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
7000: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 30 2c 20  wind,     0, 0, 
7010: 20 20 20 20 20 20 30 7d 2c 20 0a 20 20 20 20 20        0}, .     
7020: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
7030: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
7040: 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20  , /* 2 */.      
7050: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
7060: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c   0, ADDR(8), 0},
7070: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
7080: 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20   OP_Dup,        
7090: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
70a0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
70b0: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
70c0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
70d0: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Ne,         0,
70e0: 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20   ADDR(3), 0},.  
70f0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
7100: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7110: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
7120: 44 65 73 74 72 6f 79 2c 20 20 20 20 30 2c 20 30  Destroy,    0, 0
7130: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38  ,       0}, /* 8
7140: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
7150: 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c  etCookie,  0, 0,
7160: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20         0}, /* 9 
7170: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c  */.      { OP_Cl
7180: 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ose,      0, 0, 
7190: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
71a0: 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  .    int base;..
71b0: 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61      if( (db->fla
71c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
71d0: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ans)==0 ){.     
71e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
71f0: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
7200: 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  on, 0, 0, 0, 0);
7210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7220: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
7230: 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73  ifyCookie, db->s
7240: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 2c  chema_cookie, 0,
7250: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   0, 0);.      pP
7260: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
7270: 66 69 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  fied = 1;.    }.
7280: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
7290: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
72a0: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
72b0: 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65  Index), dropInde
72c0: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  x);.    sqliteVd
72d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
72e0: 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+2, pIndex->zN
72f0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
7300: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28  iteVdbeChangeP1(
7310: 76 2c 20 62 61 73 65 2b 38 2c 20 70 49 6e 64 65  v, base+8, pInde
7320: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 63 68  x->tnum);.    ch
7330: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
7340: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
7350: 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 39  angeP1(v, base+9
7360: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
7370: 65 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d  e);.    if( (db-
7380: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7390: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
73a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
73b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
73c0: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  t, 0, 0, 0, 0);.
73d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
73e0: 4d 61 72 6b 20 74 68 65 20 69 6e 74 65 72 6e 61  Mark the interna
73f0: 6c 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  l Index structur
7400: 65 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e 20 62  e for deletion b
7410: 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  y the.  ** sqlit
7420: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
7430: 68 61 6e 67 65 73 20 72 6f 75 74 69 6e 65 2e 0a  hanges routine..
7440: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
7450: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
7460: 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 44 65 6c     pIndex->isDel
7470: 65 74 65 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d  ete = 1;.    db-
7480: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
7490: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
74a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
74b0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
74c0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
74d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
74e0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
74f0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
7500: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7510: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
7520: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
7530: 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41  *sqliteExprListA
7540: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
7550: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
7560: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
7570: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
7580: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
7590: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
75a0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
75b0: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
75c0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
75d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
75e0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
75f0: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
7600: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
7610: 45 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 70 4c  Expr + 8;.    pL
7620: 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52  ist->a = sqliteR
7630: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
7640: 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d   n*sizeof(pList-
7650: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
7660: 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a   pList->a==0 ){.
7670: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78        pList->nEx
7680: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  pr = 0;.      re
7690: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20  turn pList;.    
76a0: 7d 0a 20 20 7d 0a 20 20 69 20 3d 20 70 4c 69 73  }.  }.  i = pLis
76b0: 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 70 4c  t->nExpr++;.  pL
76c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
76d0: 3d 20 70 45 78 70 72 3b 0a 20 20 70 4c 69 73 74  = pExpr;.  pList
76e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  ->a[i].zName = 0
76f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
7700: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
7710: 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b  tring(&pList->a[
7720: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  i].zName, pName-
7730: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
7740: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
7750: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
7760: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zName);.  }.  re
7770: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
7780: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
7790: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
77a0: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
77b0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
77c0: 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ete(ExprList *pL
77d0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
77e0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
77f0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7800: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
7810: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
7820: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c  iteExprDelete(pL
7830: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
7840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
7850: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
7860: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
7870: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
7880: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
7890: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ist);.}../*.** A
78a0: 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
78b0: 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
78c0: 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
78d0: 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
78e0: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
78f0: 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
7900: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
7910: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
7920: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
7930: 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41  t *sqliteIdListA
7940: 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c  ppend(IdList *pL
7950: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
7960: 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
7970: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
7980: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7990: 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
79a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
79b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
79c0: 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74    }.  if( (pList
79d0: 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b  ->nId & 7)==0 ){
79e0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
79f0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
7a00: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
7a10: 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c  nId+8)*sizeof(pL
7a20: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
7a30: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d    if( pList->a==
7a40: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
7a50: 2d 3e 6e 49 64 20 3d 20 30 3b 0a 20 20 20 20 20  ->nId = 0;.     
7a60: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
7a70: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
7a80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
7a90: 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  }.  }.  memset(&
7aa0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
7ab0: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
7ac0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
7ad0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
7ae0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
7af0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
7b00: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
7b10: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
7b20: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
7b30: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
7b40: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
7b50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
7b60: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
7b70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
7b80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7b90: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
7ba0: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
7bb0: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
7bc0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
7bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
7be0: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
7bf0: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
7c00: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
7c10: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
7c20: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
7c30: 41 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20  AddAlias(IdList 
7c40: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
7c50: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
7c60: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49  ist && pList->nI
7c70: 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  d>0 ){.    int i
7c80: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20   = pList->nId - 
7c90: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
7ca0: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
7cb0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
7cc0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
7cd0: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
7ce0: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
7cf0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
7d00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
7d10: 65 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69  e an entire IdLi
7d20: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
7d30: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
7d40: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
7d50: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
7d60: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
7d70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
7d80: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
7d90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
7da0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
7db0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
7dc0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
7dd0: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ias);.    if( pL
7de0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
7df0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7e00: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
7e10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7e20: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
7e30: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
7e40: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
7e50: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
7e60: 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
7e70: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
7e80: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
7e90: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
7ea0: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
7eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
7ec0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
7ed0: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
7ee0: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
7ef0: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
7f00: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
7f10: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
7f20: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
7f30: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
7f40: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
7f50: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
7f60: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
7f70: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
7f80: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
7f90: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
7fa0: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
7fb0: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
7fc0: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
7fd0: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
7fe0: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
7ff0: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
8000: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
8010: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
8020: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
8030: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
8040: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
8050: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
8060: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
8070: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
8080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8090: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
80a0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
80b0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
80c0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  e,   /* The name
80d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
80e0: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
80f0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
8100: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
8110: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
8120: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
8130: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
8140: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
8150: 6d 69 74 65 72 20 20 20 20 2f 2a 20 55 73 65 20  miter    /* Use 
8160: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
8170: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29  d delimiter */.)
8180: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
8190: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20  .  char *zTab;. 
81a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62   int i, j;.  Vdb
81b0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72  e *v;.  int addr
81c0: 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a  , end;.  Index *
81d0: 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a  pIdx;.  sqlite *
81e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
81f0: 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74  ..  zTab = sqlit
8200: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
8210: 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b  ken(pTableName);
8220: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
8230: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a  lloc_failed || z
8240: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f  Tab==0 ) goto co
8250: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54  py_cleanup;.  pT
8260: 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
8270: 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 29 3b 0a  able(db, zTab);.
8280: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
8290: 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  b);.  if( pTab==
82a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
82b0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
82c0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
82d0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
82e0: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  , .        pTabl
82f0: 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65  eName->z, pTable
8300: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
8310: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
8320: 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63  .    goto copy_c
8330: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66  leanup;.  }.  if
8340: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
8350: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
8360: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
8370: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
8380: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
8390: 0a 20 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e  .        " may n
83a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c  ot be modified",
83b0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
83c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
83d0: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
83e0: 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
83f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
8400: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
8410: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
8420: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
8430: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8440: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8450: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
8460: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
8470: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8480: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
8490: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d  ookie, db->schem
84a0: 61 5f 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c 20  a_cookie, 0, 0, 
84b0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
84c0: 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64  ->schemaVerified
84d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
84e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
84f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
8500: 65 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  eOpen, 0, 0, 0, 
8510: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
8520: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
8530: 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a  dr, pFilename->z
8540: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b  , pFilename->n);
8550: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
8560: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
8570: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
8580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
8590: 6e 57 72 69 74 65 2c 20 30 2c 20 70 54 61 62 2d  nWrite, 0, pTab-
85a0: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61  >tnum, pTab->zNa
85b0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  me, 0);.    for(
85c0: 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=1, pIdx=pTab->
85d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
85e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
85f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
8600: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8610: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 2c 20  P_OpenWrite, i, 
8620: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78  pIdx->tnum, pIdx
8630: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
8640: 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c   }.    end = sql
8650: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
8660: 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  (v);.    addr = 
8670: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8680: 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c 20  v, OP_FileRead, 
8690: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 2c  pTab->nCol, end,
86a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
86b0: 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20  pDelimiter ){.  
86c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
86d0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
86e0: 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70  pDelimiter->z, p
86f0: 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20  Delimiter->n);. 
8700: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44       sqliteVdbeD
8710: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
8720: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8730: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
8740: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
8750: 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  "\t", 1);.    }.
8760: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8770: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
8780: 6e 6f 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  no, 0, 0, 0, 0);
8790: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
87a0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 73  Index ){.      s
87b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
87c0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20  , OP_Dup, 0, 0, 
87d0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
87e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
87f0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8800: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8810: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
8820: 6c 75 6d 6e 2c 20 69 2c 20 30 2c 20 30 2c 20 30  lumn, i, 0, 0, 0
8830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8840: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8850: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
8860: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 2c 20 30 2c  Tab->nCol, 0, 0,
8870: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
8880: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
8890: 75 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ut, 0, 0, 0, 0);
88a0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
88b0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
88c0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
88d0: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
88e0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70       if( pIdx->p
88f0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
8900: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8910: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
8920: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
8930: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8940: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
8950: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  j++){.        sq
8960: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8970: 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20   OP_FileColumn, 
8980: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
8990: 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ], 0, 0, 0);.   
89a0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
89b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
89c0: 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 64  _MakeIdxKey, pId
89d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  x->nColumn, 0, 0
89e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
89f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8a00: 50 5f 50 75 74 49 64 78 2c 20 69 2c 20 30 2c 20  P_PutIdx, i, 0, 
8a10: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
8a20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8a30: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
8a40: 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  addr, 0, 0);.   
8a50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8a60: 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
8a70: 30 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20  0, 0, end);.    
8a80: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
8a90: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
8aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8ab0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8ac0: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  OP_Commit, 0, 0,
8ad0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
8ae0: 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75  }.  .copy_cleanu
8af0: 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  p:.  return;.}..
8b00: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74  /*.** The non-st
8b10: 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20 63 6f  andard VACUUM co
8b20: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
8b30: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61   clean up the da
8b40: 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61  tabase,.** colla
8b50: 70 73 65 20 66 72 65 65 20 73 70 61 63 65 2c 20  pse free space, 
8b60: 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65  etc.  It is mode
8b70: 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 56  lled after the V
8b80: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  ACUUM command.**
8b90: 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a   in PostgreSQL..
8ba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61  */.void sqliteVa
8bb0: 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72  cuum(Parse *pPar
8bc0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  se, Token *pTabl
8bd0: 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  eName){.  char *
8be0: 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  zName;.  Vdbe *v
8bf0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
8c00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
8c10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
8c20: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
8c30: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
8c40: 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 4e  n;.  if( pTableN
8c50: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
8c60: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
8c70: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
8c80: 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  leName);.  }else
8c90: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
8ca0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
8cb0: 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64 49 6e   && sqliteFindIn
8cc0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d  dex(db, zName)==
8cd0: 30 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 46  0.    && sqliteF
8ce0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
8cf0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  me)==0 ){.    sq
8d00: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
8d10: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
8d20: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 6f  "no such table o
8d30: 72 20 69 6e 64 65 78 3a 20 22 2c 20 7a 4e 61 6d  r index: ", zNam
8d40: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
8d50: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
8d60: 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c 65 61 6e  oto vacuum_clean
8d70: 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  up;.  }.  v = sq
8d80: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
8d90: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
8da0: 29 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c  ) goto vacuum_cl
8db0: 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 28 64 62  eanup;.  if( (db
8dc0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8dd0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
8de0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8df0: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
8e00: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ction, 0, 0, 0, 
8e10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
8e20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
8e30: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e  rifyCookie, db->
8e40: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
8e50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
8e60: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
8e70: 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  ied = 1;.  }.  i
8e80: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
8e90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8ea0: 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65  v, OP_Reorganize
8eb0: 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30  , 0, 0, zName, 0
8ec0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8ed0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
8ee0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8ef0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b 0a    HashElem *pE;.
8f00: 20 20 20 20 66 6f 72 28 70 45 3d 73 71 6c 69 74      for(pE=sqlit
8f10: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
8f20: 74 62 6c 48 61 73 68 29 3b 20 70 45 3b 20 70 45  tblHash); pE; pE
8f30: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8f40: 70 45 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  pE)){.      pTab
8f50: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
8f60: 61 28 70 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  a(pE);.      sql
8f70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8f80: 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30  OP_Reorganize, 0
8f90: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
8fa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
8fb0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
8fc0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
8fd0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
8fe0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8ff0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61  dOp(v, OP_Reorga
9000: 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 70 49 64 78  nize, 0, 0, pIdx
9010: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
9020: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9030: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
9040: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
9050: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
9060: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9070: 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20  P_Commit, 0, 0, 
9080: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 76 61 63 75  0, 0);.  }..vacu
9090: 75 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  um_cleanup:.  sq
90a0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
90b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
90c0: 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
90d0: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
90e0: 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73  sqliteBeginTrans
90f0: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
9100: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
9110: 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
9120: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
9130: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
9140: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
9150: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
9160: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
9170: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
9180: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
9190: 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  rn;.  if( db->fl
91a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
91b0: 72 61 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20  rans ) return;. 
91c0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
91d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
91e0: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
91f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9200: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31 2c  _Transaction, 1,
9210: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
9220: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9230: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
9240: 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e, db->schema_co
9250: 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  okie, 0, 0, 0);.
9260: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65      pParse->sche
9270: 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a  maVerified = 1;.
9280: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
9290: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  |= SQLITE_InTran
92a0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  s;.}../*.** Comm
92b0: 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
92c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
92d0: 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
92e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
92f0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
9300: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
9310: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
9320: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
9330: 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29   || db->pBe==0 )
9340: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
9350: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
9360: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
9370: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
9380: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
9390: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
93a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
93b0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
93c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
93d0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
93e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
93f0: 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 2c  Commit, 0, 0, 0,
9400: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   0);.  }.  db->f
9410: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
9420: 49 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  InTrans;.}../*.*
9430: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
9440: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
9450: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54   sqliteRollbackT
9460: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
9470: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
9480: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
9490: 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
94a0: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
94b0: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
94c0: 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72  ->pBe==0 ) retur
94d0: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
94e0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
94f0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
9500: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
9510: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9520: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20  E_InTrans)==0 ) 
9530: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
9540: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
9550: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
9560: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9570: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
9580: 63 6b 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ck, 0, 0, 0, 0);
9590: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
95a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
95b0: 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ans;.}../*.** In
95c0: 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76 65  terpret the give
95d0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 62 6f  n string as a bo
95e0: 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
95f0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 42 6f  static int getBo
9600: 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  olean(char *z){.
9610: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
9620: 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73  zTrue[] = { "yes
9630: 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20  ", "on", "true" 
9640: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  };.  int i;.  if
9650: 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  ( z[0]==0 ) retu
9660: 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69  rn 0;.  if( isdi
9670: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b  git(z[0]) || (z[
9680: 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67  0]=='-' && isdig
9690: 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20  it(z[1])) ){.   
96a0: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b   return atoi(z);
96b0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
96c0: 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29  i<sizeof(azTrue)
96d0: 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30  /sizeof(azTrue[0
96e0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
96f0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
9700: 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20  z,azTrue[i])==0 
9710: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
9720: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9730: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
9740: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
9750: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
9760: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
9770: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
9780: 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a  AGMA id = value.
9790: 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69  **.** The identi
97a0: 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  fier might also 
97b0: 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68  be a string.  Th
97c0: 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
97d0: 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e  ing, and.** iden
97e0: 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d  tifier, or a num
97f0: 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c  ber.  If minusFl
9800: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
9810: 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   the value is.**
9820: 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77   a number that w
9830: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
9840: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a   minus sign..*/.
9850: 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d  void sqlitePragm
9860: 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
9870: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
9880: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e  oken *pRight, in
9890: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
98a0: 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
98b0: 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20  .  char *zRight 
98c0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  = 0;.  sqlite *d
98d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
98e0: 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74  .  zLeft = sqlit
98f0: 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e  eStrNDup(pLeft->
9900: 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20  z, pLeft->n);.  
9910: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
9920: 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75  eft);.  if( minu
9930: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69  sFlag ){.    zRi
9940: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ght = 0;.    sql
9950: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
9960: 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70  Right, "-", 1, p
9970: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
9980: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
9990: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
99a0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69  qliteStrNDup(pRi
99b0: 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
99c0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  n);.    sqliteDe
99d0: 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20  quote(zRight);. 
99e0: 20 7d 0a 20 0a 20 20 69 66 28 20 73 71 6c 69 74   }. .  if( sqlit
99f0: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
9a00: 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20  cache_size")==0 
9a10: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 20  ){.    int size 
9a20: 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  = atoi(zRight);.
9a30: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
9a40: 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
9a50: 70 42 65 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 65  pBe, size);.  }e
9a60: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
9a70: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
9a80: 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30  "vdbe_trace")==0
9a90: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
9aa0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
9ab0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
9ac0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65  s |= SQLITE_Vdbe
9ad0: 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Trace;.    }else
9ae0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
9af0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62  s &= ~SQLITE_Vdb
9b00: 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20  eTrace;.    }.  
9b10: 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e  }else..#ifndef N
9b20: 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
9b30: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
9b40: 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22 29   "parser_trace")
9b50: 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
9b60: 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61 72  n void sqlitePar
9b70: 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20  serTrace(FILE*, 
9b80: 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66 28  char *);.    if(
9b90: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
9ba0: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ht) ){.      sql
9bb0: 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 73  iteParserTrace(s
9bc0: 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20  tdout, "parser: 
9bd0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
9be0: 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65       sqliteParse
9bf0: 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20  rTrace(0, 0);.  
9c00: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
9c10: 69 66 0a 0a 20 20 69 66 28 20 7a 4c 65 66 74 20  if..  if( zLeft 
9c20: 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65  ) sqliteFree(zLe
9c30: 66 74 29 3b 0a 20 20 69 66 28 20 7a 52 69 67 68  ft);.  if( zRigh
9c40: 74 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a  t ) sqliteFree(z
9c50: 52 69 67 68 74 29 3b 0a 7d 0a                    Right);.}.