/ Hex Artifact Content
Login

Artifact 501c96f8224f1dd6c87c53c1ca7de62c3a98d5bb:


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 32 20 32 30 30  ild.c,v 1.42 200
0320: 31 2f 30 39 2f 32 37 20 30 33 3a 32 32 3a 33 33  1/09/27 03:22:33
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 69 6e 74 20 69 73 55 6e 69 71 75 65 2c 20    int isUnique, 
5120: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
5130: 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 69  l entries in thi
5140: 73 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  s index must be 
5150: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 54 6f 6b 65  unique */.  Toke
5160: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
5170: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
5180: 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43   that begins a C
5190: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
51a0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
51b0: 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54   *pEnd      /* T
51c0: 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
51d0: 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
51e0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
51f0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5200: 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
5210: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
5220: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
5230: 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
5240: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
5250: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
5260: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
5270: 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
5280: 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
5290: 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
52a0: 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  D list */.  sqli
52b0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
52c0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
52d0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
52e0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
52f0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
5300: 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a  ate_index;..  /*
5310: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
5320: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
5330: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
5340: 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
5350: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
5360: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
5370: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
5380: 65 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e!=0 );.    pTab
5390: 20 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65 46   =  sqliteTableF
53a0: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  romToken(pParse,
53b0: 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
53c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
53d0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
53e0: 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
53f0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
5400: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
5410: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
5420: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
5430: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
5440: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
5450: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
5460: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
5470: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
5480: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
5490: 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65    " may not have
54a0: 20 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64 64   new indices add
54b0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
54c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
54d0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
54e0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
54f0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
5500: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
5510: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
5520: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
5530: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
5540: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
5550: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
5560: 6d 65 2e 20 20 49 66 20 70 4e 61 6d 65 3d 3d 30  me.  If pName==0
5570: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
5580: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
5590: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
55a0: 79 20 6b 65 79 2c 20 77 68 69 63 68 20 68 61 73  y key, which has
55b0: 20 6e 6f 20 6e 61 6d 65 2c 20 73 6f 20 74 68 69   no name, so thi
55c0: 73 20 73 74 65 70 20 63 61 6e 20 62 65 0a 20 20  s step can be.  
55d0: 2a 2a 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  ** skipped..  */
55e0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
55f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
5600: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
5610: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
5620: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
5630: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
5640: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
5650: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
5660: 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  db, zName) ){.  
5670: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
5680: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
5690: 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20  rMsg, "index ", 
56a0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
56b0: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
56c0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  s", 0);.      pP
56d0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
56e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
56f0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
5700: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5710: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
5720: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
5730: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
5740: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
5750: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
5760: 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
5770: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
5780: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  e, 0);.      pPa
5790: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
57a0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
57b0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
57c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
57d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
57e0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
57f0: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
5800: 2c 20 22 20 28 70 72 69 6d 61 72 79 20 6b 65 79  , " (primary key
5810: 29 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  )", 0);.    if( 
5820: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
5830: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
5840: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  x;.  }..  /* If 
5850: 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
5860: 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
5870: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
5880: 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
5890: 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
58a0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
58b0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
58c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
58d0: 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
58e0: 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
58f0: 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
5900: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
5910: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
5920: 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
5930: 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
5940: 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
5950: 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c  d.n = strlen(nul
5960: 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
5970: 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  t = sqliteIdList
5980: 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49  Append(0, &nullI
5990: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
59a0: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
59b0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
59c0: 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
59d0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
59e0: 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
59f0: 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
5a00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5a10: 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
5a20: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
5a50: 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29  nt)*pList->nId )
5a60: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
5a70: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
5a80: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
5a90: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
5aa0: 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31   (int*)&pIndex[1
5ab0: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
5ac0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
5ad0: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
5ae0: 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72  ist->nId];.  str
5af0: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
5b00: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
5b10: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
5b20: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
5b30: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
5b40: 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 73  Id;.  pIndex->is
5b50: 55 6e 69 71 75 65 20 3d 20 69 73 55 6e 69 71 75  Unique = isUniqu
5b60: 65 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68  e;..  /* Scan th
5b70: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
5b80: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
5b90: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
5ba0: 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
5bb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
5bc0: 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
5bd0: 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
5be0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
5bf0: 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
5c00: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
5c10: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5c20: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
5c30: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
5c40: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
5c50: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
5c60: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
5c70: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
5c80: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
5c90: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
5ca0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
5cb0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
5cc0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
5cd0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
5ce0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
5cf0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
5d00: 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20         " has no 
5d10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20  column named ", 
5d20: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
5d30: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  e, 0);.      pPa
5d40: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5d50: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
5d60: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
5d70: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
5d80: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
5d90: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
5da0: 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f  i] = j;.  }..  /
5db0: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
5dc0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
5dd0: 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
5de0: 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
5df0: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
5e00: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
5e10: 20 20 4e 6f 74 65 20 74 68 61 74 20 70 72 69 6d    Note that prim
5e20: 61 72 79 20 6b 65 79 20 69 6e 64 69 63 65 73 0a  ary key indices.
5e30: 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 70 70 65    ** do not appe
5e40: 61 72 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ar in the index 
5e50: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
5e60: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
5e70: 78 70 6c 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  xplain==0 ){.   
5e80: 20 69 66 28 20 70 4e 61 6d 65 21 3d 30 20 29 7b   if( pName!=0 ){
5e90: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
5ea0: 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  me = pIndex->zNa
5eb0: 6d 65 3b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me;;.      sqlit
5ec0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
5ed0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
5ee0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
5ef0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  , pIndex);.    }
5f00: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
5f10: 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
5f20: 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  x;.    pTab->pIn
5f30: 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
5f40: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
5f50: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
5f60: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ges;.  }..  /* I
5f70: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
5f80: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
5f90: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
5fa0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
5fb0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
5fc0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
5fd0: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
5fe0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
5ff0: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
6000: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
6010: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
6020: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
6030: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
6040: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
6050: 61 67 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ag ){.    pIndex
6060: 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d  ->tnum = pParse-
6070: 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  >newTnum;.  }.. 
6080: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
6090: 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20 63 72  lag is 0 then cr
60a0: 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
60b0: 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
60c0: 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
60d0: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
60e0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
60f0: 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
6100: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
6110: 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
6120: 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
6130: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
6140: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77   initFlag is 0 w
6150: 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
6160: 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
6170: 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
6180: 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69  ommand.  The ini
6190: 74 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20  tFlag is 1 when 
61a0: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
61b0: 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
61c0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
61d0: 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
61e0: 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
61f0: 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
6200: 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
6210: 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
6220: 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
6230: 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
6240: 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
6250: 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
6260: 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
6270: 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65   pTable==0 it me
6280: 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
6290: 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
62a0: 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
62b0: 2a 20 61 6e 64 20 74 68 6f 73 65 20 64 6f 65 73  * and those does
62c0: 20 6e 6f 74 20 68 61 76 65 20 61 20 43 52 45 41   not have a CREA
62d0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
62e0: 6e 74 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  nt to add to the
62f0: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 20 74 61 62  .  ** master tab
6300: 6c 65 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65  le.  Also, since
6310: 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 61 72   primary keys ar
6320: 65 20 63 72 65 61 74 65 64 20 61 74 20 74 68 65  e created at the
6330: 20 73 61 6d 65 0a 20 20 2a 2a 20 74 69 6d 65 20   same.  ** time 
6340: 61 73 20 74 61 62 6c 65 73 2c 20 74 68 65 20 74  as tables, the t
6350: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 65 6d 70  able will be emp
6360: 74 79 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  ty so there is n
6370: 6f 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 69  o need to.  ** i
6380: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e  nitialize the in
6390: 64 65 78 2e 20 20 48 65 6e 63 65 2c 20 73 6b 69  dex.  Hence, ski
63a0: 70 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 67  p all the code g
63b0: 65 6e 65 72 61 74 69 6f 6e 20 69 66 0a 20 20 2a  eneration if.  *
63c0: 2a 20 70 54 61 62 6c 65 3d 3d 30 2e 0a 20 20 2a  * pTable==0..  *
63d0: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61  /.  else if( pPa
63e0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30  rse->initFlag==0
63f0: 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b   && pTable!=0 ){
6400: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
6410: 4f 70 20 61 64 64 54 61 62 6c 65 5b 5d 20 3d 20  Op addTable[] = 
6420: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  {.      { OP_Ope
6430: 6e 57 72 69 74 65 2c 20 20 20 32 2c 20 32 2c 20  nWrite,   2, 2, 
6440: 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20  MASTER_NAME},.  
6450: 20 20 20 20 7b 20 4f 50 5f 4e 65 77 52 65 63 6e      { OP_NewRecn
6460: 6f 2c 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a  o,    2, 0, 0},.
6470: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
6480: 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 22 69  g,      0, 0, "i
6490: 6e 64 65 78 22 7d 2c 0a 20 20 20 20 20 20 7b 20  ndex"},.      { 
64a0: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20  OP_String,      
64b0: 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 33 20  0, 0, 0},  /* 3 
64c0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  */.      { OP_St
64d0: 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c  ring,      0, 0,
64e0: 20 30 7d 2c 20 20 2f 2a 20 34 20 2a 2f 0a 20 20   0},  /* 4 */.  
64f0: 20 20 20 20 7b 20 4f 50 5f 43 72 65 61 74 65 49      { OP_CreateI
6500: 6e 64 65 78 2c 20 31 2c 20 30 2c 20 30 7d 2c 0a  ndex, 1, 0, 0},.
6510: 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
6520: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d          0, 0, 0}
6530: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  ,.      { OP_Ope
6540: 6e 57 72 69 74 65 2c 20 20 20 31 2c 20 30 2c 20  nWrite,   1, 0, 
6550: 30 7d 2c 20 20 2f 2a 20 37 20 2a 2f 0a 20 20 20  0},  /* 7 */.   
6560: 20 20 20 7b 20 4f 50 5f 4e 75 6c 6c 2c 20 20 20     { OP_Null,   
6570: 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20       0, 0, 0},. 
6580: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
6590: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c  ,      0, 0, 0},
65a0: 20 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20    /* 9 */.      
65b0: 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  { OP_MakeRecord,
65c0: 20 20 36 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    6, 0, 0},.    
65d0: 20 20 7b 20 4f 50 5f 50 75 74 2c 20 20 20 20 20    { OP_Put,     
65e0: 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20      2, 0, 0},.  
65f0: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
6600: 69 65 2c 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20  ie,   0, 0, 0}, 
6610: 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 20 20   /* 12 */.      
6620: 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20  { OP_Close,     
6630: 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    2, 0, 0},.    
6640: 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  };.    int n;.  
6650: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6660: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
6670: 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20  nt lbl1, lbl2;. 
6680: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 76     int i;..    v
6690: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
66a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
66b0: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
66c0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
66d0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21  .    if( pTable!
66e0: 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  =0 && (db->flags
66f0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
6700: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)==0 ){.      s
6710: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6720: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
6730: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
6740: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6750: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
6760: 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68  yCookie, db->sch
6770: 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 2c 20 30  ema_cookie, 0, 0
6780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
6790: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
67a0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
67b0: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
67c0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
67d0: 74 20 62 61 73 65 3b 0a 20 20 20 20 20 20 6e 20  t base;.      n 
67e0: 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d  = (int)pEnd->z -
67f0: 20 28 69 6e 74 29 70 53 74 61 72 74 2d 3e 7a 20   (int)pStart->z 
6800: 2b 20 31 3b 0a 20 20 20 20 20 20 62 61 73 65 20  + 1;.      base 
6810: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
6820: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
6830: 7a 65 28 61 64 64 54 61 62 6c 65 29 2c 20 61 64  ze(addTable), ad
6840: 64 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  dTable);.      s
6850: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
6860: 33 28 76 2c 20 62 61 73 65 2b 33 2c 20 70 49 6e  3(v, base+3, pIn
6870: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
6880: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6890: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
68a0: 2b 34 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  +4, pTab->zName,
68b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
68c0: 65 56 64 62 65 49 6e 64 65 78 52 6f 6f 74 41 64  eVdbeIndexRootAd
68d0: 64 72 28 76 2c 20 26 70 49 6e 64 65 78 2d 3e 74  dr(v, &pIndex->t
68e0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  num);.      sqli
68f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6900: 2c 20 62 61 73 65 2b 37 2c 20 70 49 6e 64 65 78  , base+7, pIndex
6910: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
6920: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6930: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 39 2c  ngeP3(v, base+9,
6940: 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a   pStart->z, n);.
6950: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
6960: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71  ie(db);.      sq
6970: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31  liteVdbeChangeP1
6980: 28 76 2c 20 62 61 73 65 2b 31 32 2c 20 64 62 2d  (v, base+12, db-
6990: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20  >next_cookie);. 
69a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
69b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
69c0: 70 65 6e 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e  pen, 0, pTab->tn
69d0: 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  um, pTab->zName,
69e0: 20 30 29 3b 0a 20 20 20 20 6c 62 6c 31 20 3d 20   0);.    lbl1 = 
69f0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
6a00: 62 65 6c 28 76 29 3b 0a 20 20 20 20 6c 62 6c 32  bel(v);.    lbl2
6a10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
6a20: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73  eLabel(v);.    s
6a30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6a40: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 2c 20  , OP_Rewind, 0, 
6a50: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
6a60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6a70: 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 6c 62 6c   OP_Next, 0, lbl
6a80: 32 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  2, 0, lbl1);.   
6a90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6aa0: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 30 2c  (v, OP_Recno, 0,
6ab0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66   0, 0, 0);.    f
6ac0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
6ad0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
6ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6af0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
6b00: 75 6d 6e 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  umn, 0, pIndex->
6b10: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2c 20 30 2c 20  aiColumn[i], 0, 
6b20: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6b30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6b40: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20   OP_MakeIdxKey, 
6b50: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c  pIndex->nColumn,
6b60: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
6b70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6b80: 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 31 2c 20  , OP_PutIdx, 1, 
6b90: 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65  pIndex->isUnique
6ba0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6bb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6bc0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31  OP_Goto, 0, lbl1
6bd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6be0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6bf0: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30  OP_Noop, 0, 0, 0
6c00: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 73 71 6c  , lbl2);.    sql
6c10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6c20: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 2c 20  OP_Close, 1, 0, 
6c30: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6c40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6c50: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c  _Close, 0, 0, 0,
6c60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61   0);.    if( pTa
6c70: 62 6c 65 21 3d 30 20 26 26 20 28 64 62 2d 3e 66  ble!=0 && (db->f
6c80: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
6c90: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
6ca0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6cb0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
6cc0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
6cd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
6ce0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 6f 6e 20  claim memory on 
6cf0: 61 6e 20 45 58 50 4c 41 49 4e 20 63 61 6c 6c 2e  an EXPLAIN call.
6d00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
6d10: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
6d20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
6d30: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
6d40: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
6d50: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
6d60: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
6d70: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
6d80: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
6d90: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
6da0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6db0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6dc0: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
6dd0: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
6de0: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
6df0: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
6e00: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6e10: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
6e20: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61  x *pIndex;.  cha
6e30: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
6e40: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
6e50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6e60: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
6e70: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
6e80: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
6e90: 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  turn;.  zName = 
6ea0: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
6eb0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
6ec0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
6ed0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64  ) return;.  pInd
6ee0: 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  ex = sqliteFindI
6ef0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  ndex(db, zName);
6f00: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
6f10: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ame);.  if( pInd
6f20: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
6f30: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
6f40: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
6f50: 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
6f60: 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70  ", 0, .        p
6f70: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
6f80: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
6f90: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
6fa0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6fb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
6fc0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
6fd0: 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
6fe0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
6ff0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
7000: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
7010: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
7020: 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e  ic VdbeOp dropIn
7030: 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dex[] = {.      
7040: 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  { OP_OpenWrite, 
7050: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 4d 41 53   0, 2,       MAS
7060: 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20  TER_NAME},.     
7070: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
7080: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
7090: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
70a0: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
70b0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a        0}, /* 2 *
70c0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  /.      { OP_Nex
70d0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
70e0: 28 38 29 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f  (8), 0}, /* 3 */
70f0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c  .      { OP_Dup,
7100: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
7110: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
7120: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
7130: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
7140: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
7150: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
7160: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
7170: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
7180: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
7190: 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79 2c     { OP_Destroy,
71a0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
71b0: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
71c0: 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65    { OP_SetCookie
71d0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30  ,  0, 0,       0
71e0: 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20  }, /* 9 */.     
71f0: 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20   { OP_Close,    
7200: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
7210: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
7220: 20 62 61 73 65 3b 0a 0a 20 20 20 20 69 66 28 20   base;..    if( 
7230: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
7240: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
7250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
7260: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
7270: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
7280: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
7290: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
72a0: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
72b0: 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e, db->schema_co
72c0: 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  okie, 0, 0, 0);.
72d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63        pParse->sc
72e0: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
72f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65  ;.    }.    base
7300: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
7310: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
7320: 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20  ize(dropIndex), 
7330: 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  dropIndex);.    
7340: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
7350: 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20 70 49  P3(v, base+2, pI
7360: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
7370: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
7380: 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b  hangeP1(v, base+
7390: 38 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29  8, pIndex->tnum)
73a0: 3b 0a 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b  ;.    changeCook
73b0: 69 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ie(db);.    sqli
73c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  teVdbeChangeP1(v
73d0: 2c 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65  , base+9, db->ne
73e0: 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  xt_cookie);.    
73f0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
7400: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
7410: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
7420: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7430: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  OP_Commit, 0, 0,
7440: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7450: 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
7460: 20 69 6e 74 65 72 6e 61 6c 20 49 6e 64 65 78 20   internal Index 
7470: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65  structure for de
7480: 6c 65 74 69 6f 6e 20 62 79 20 74 68 65 0a 20 20  letion by the.  
7490: 2a 2a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  ** sqliteCommitI
74a0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 20 72  nternalChanges r
74b0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  outine..  */.  i
74c0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
74d0: 61 69 6e 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  ain ){.    pInde
74e0: 78 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 31 3b  x->isDelete = 1;
74f0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
7500: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
7510: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hanges;.  }.}../
7520: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
7530: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
7540: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
7550: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
7560: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
7570: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
7580: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
7590: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
75a0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45  xprList *sqliteE
75b0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
75c0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
75d0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
75e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
75f0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
7600: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
7610: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
7620: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
7630: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
7640: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
7650: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73  .  }.  if( (pLis
7660: 74 2d 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30  t->nExpr & 7)==0
7670: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
7680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38  pList->nExpr + 8
7690: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  ;.    pList->a =
76a0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
76b0: 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f  List->a, n*sizeo
76c0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
76d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
76e0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  a==0 ){.      pL
76f0: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a  ist->nExpr = 0;.
7700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69        return pLi
7710: 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  st;.    }.  }.  
7720: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  i = pList->nExpr
7730: 2b 2b 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69  ++;.  pList->a[i
7740: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
7750: 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
7760: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Name = 0;.  if( 
7770: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  pName ){.    sql
7780: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
7790: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
77a0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
77b0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  e->n, 0);.    sq
77c0: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
77d0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
77e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
77f0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
7800: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
7810: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
7820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70  /.void sqliteExp
7830: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
7840: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
7850: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
7860: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
7870: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
7880: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7890: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
78a0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
78b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ].pExpr);.    sq
78c0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
78d0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
78e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
78f0: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
7900: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
7910: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
7920: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
7930: 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
7940: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
7950: 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
7960: 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
7970: 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
7980: 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
7990: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
79a0: 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
79b0: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64  eIdListAppend(Id
79c0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
79d0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
79e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
79f0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
7a00: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7a10: 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
7a20: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
7a30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7a40: 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20  ( (pList->nId & 
7a50: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  7)==0 ){.    pLi
7a60: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
7a70: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
7a80: 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73  (pList->nId+8)*s
7a90: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
7aa0: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ]) );.    if( pL
7ab0: 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  ist->a==0 ){.   
7ac0: 20 20 20 70 4c 69 73 74 2d 3e 6e 49 64 20 3d 20     pList->nId = 
7ad0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  0;.      sqliteI
7ae0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
7af0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
7b00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
7b10: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
7b20: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c  [pList->nId], 0,
7b30: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
7b40: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
7b50: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
7b60: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
7b70: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
7b80: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
7b90: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f  tNString(pz, pTo
7ba0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
7bb0: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
7bc0: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
7bd0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
7be0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
7bf0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
7c00: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
7c10: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
7c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
7c30: 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
7c40: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
7c50: 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
7c60: 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
7c70: 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
7c80: 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
7c90: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
7ca0: 74 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73  teIdListAddAlias
7cb0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
7cc0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
7cd0: 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
7ce0: 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20  List->nId>0 ){. 
7cf0: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
7d00: 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73  ->nId - 1;.    s
7d10: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
7d20: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
7d30: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
7d40: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
7d50: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
7d60: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
7d70: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
7d80: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
7d90: 69 72 65 20 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f  ire IdList.*/.vo
7da0: 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  id sqliteIdListD
7db0: 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c  elete(IdList *pL
7dc0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
7dd0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
7de0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7df0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
7e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
7e10: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
7e20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
7e30: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
7e40: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
7e50: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
7e60: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
7e70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
7e80: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
7e90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
7ea0: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
7eb0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
7ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
7ed0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73  eteTable(0, pLis
7ee0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20  t->a[i].pTab);. 
7ef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
7f00: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
7f10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
7f20: 69 73 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ist);.}.../*.** 
7f30: 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64  The COPY command
7f40: 20 69 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62   is for compatib
7f50: 69 6c 69 74 79 20 77 69 74 68 20 50 6f 73 74 67  ility with Postg
7f60: 72 65 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66  reSQL and specif
7f70: 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74  icially.** for t
7f80: 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65  he ability to re
7f90: 61 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ad the output of
7fa0: 20 70 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66   pg_dump.  The f
7fb0: 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66  ormat is as.** f
7fc0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
7fd0: 20 43 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d   COPY table FROM
7fe0: 20 66 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c   file [USING DEL
7ff0: 49 4d 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a  IMITERS string].
8000: 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73  **.** "table" is
8010: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
8020: 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c  le name.  We wil
8030: 6c 20 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20  l read lines of 
8040: 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c  code from.** fil
8050: 65 20 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74  e to fill this t
8060: 61 62 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20  able with data. 
8070: 20 46 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22   File might be "
8080: 73 74 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74  stdin".  The opt
8090: 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74  ional.** delimit
80a0: 65 72 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69  er string identi
80b0: 66 69 65 73 20 74 68 65 20 66 69 65 6c 64 20 73  fies the field s
80c0: 65 70 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20  eparators.  The 
80d0: 64 65 66 61 75 6c 74 20 69 73 20 61 20 74 61 62  default is a tab
80e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
80f0: 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70  Copy(.  Parse *p
8100: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
8110: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
8120: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
8130: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20  TableName,   /* 
8140: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
8150: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
8160: 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20   we will insert 
8170: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c  */.  Token *pFil
8180: 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65  ename,    /* The
8190: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
81a0: 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72   to obtain infor
81b0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  mation */.  Toke
81c0: 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72 20 20 20  n *pDelimiter   
81d0: 20 2f 2a 20 55 73 65 20 74 68 69 73 20 61 73 20   /* Use this as 
81e0: 74 68 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69  the field delimi
81f0: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ter */.){.  Tabl
8200: 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20  e *pTab;.  char 
8210: 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *zTab;.  int i, 
8220: 6a 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  j;.  Vdbe *v;.  
8230: 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20  int addr, end;. 
8240: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8250: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
8260: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62  rse->db;..  zTab
8270: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
8280: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
8290: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  leName);.  if( s
82a0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
82b0: 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  led || zTab==0 )
82c0: 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e   goto copy_clean
82d0: 75 70 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  up;.  pTab = sql
82e0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
82f0: 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   zTab);.  sqlite
8300: 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66  Free(zTab);.  if
8310: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8320: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
8330: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8340: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
8350: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
8360: 20 20 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a     pTableName->z
8370: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c  , pTableName->n,
8380: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
8390: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
83a0: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
83b0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
83c0: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
83d0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
83e0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
83f0: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
8400: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
8410: 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f   " may not be mo
8420: 64 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  dified", 0);.   
8430: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
8440: 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63  .    goto copy_c
8450: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20  leanup;.  }.  v 
8460: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
8470: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
8480: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 64 62 2d   ){.    if( (db-
8490: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
84a0: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
84b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
84c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
84d0: 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c  action, 0, 0, 0,
84e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
84f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8500: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64  _VerifyCookie, d
8510: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
8520: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
8530: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
8540: 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Verified = 1;.  
8550: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
8560: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8570: 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30  , OP_FileOpen, 0
8580: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
8590: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
85a0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69 6c  P3(v, addr, pFil
85b0: 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e  ename->z, pFilen
85c0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
85d0: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
85e0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73  (v, addr);.    s
85f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8600: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
8610: 30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  0, pTab->tnum, p
8620: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
8630: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
8640: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
8650: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
8660: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
8670: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8680: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
8690: 69 74 65 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e  ite, i, pIdx->tn
86a0: 75 6d 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  um, pIdx->zName,
86b0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   0);.    }.    e
86c0: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
86d0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
86e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
86f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
8700: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
8710: 6f 6c 2c 20 65 6e 64 2c 20 30 2c 20 30 29 3b 0a  ol, end, 0, 0);.
8720: 20 20 20 20 69 66 28 20 70 44 65 6c 69 6d 69 74      if( pDelimit
8730: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
8740: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
8750: 2c 20 61 64 64 72 2c 20 70 44 65 6c 69 6d 69 74  , addr, pDelimit
8760: 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65  er->z, pDelimite
8770: 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  r->n);.      sql
8780: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
8790: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
87a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
87b0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
87c0: 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c 20 31 29  , addr, "\t", 1)
87d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
87e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
87f0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
8800: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
8810: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 29 7b   pTab->pIndex ){
8820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8830: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
8840: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
8850: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
8860: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8870: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
8880: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8890: 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c  P_FileColumn, i,
88a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
88b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
88c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
88d0: 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f  ecord, pTab->nCo
88e0: 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
88f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8900: 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20 30  (v, OP_Put, 0, 0
8910: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  , 0, 0);.    for
8920: 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=1, pIdx=pTab-
8930: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
8940: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
8950: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
8960: 20 70 49 64 78 2d 3e 70 4e 65 78 74 20 29 7b 0a   pIdx->pNext ){.
8970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8980: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
8990: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  p, 0, 0, 0, 0);.
89a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
89b0: 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
89c0: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
89d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
89e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
89f0: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 61 69  Column, pIdx->ai
8a00: 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 30 2c  Column[j], 0, 0,
8a10: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8a20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8a30: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78  Op(v, OP_MakeIdx
8a40: 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  Key, pIdx->nColu
8a50: 6d 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  mn, 0, 0, 0);.  
8a60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8a70: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 64 78  dOp(v, OP_PutIdx
8a80: 2c 20 69 2c 20 70 49 64 78 2d 3e 69 73 55 6e 69  , i, pIdx->isUni
8a90: 71 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  que, 0, 0);.    
8aa0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
8ab0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
8ac0: 2c 20 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29  , 0, addr, 0, 0)
8ad0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
8ae0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
8af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b  , 0, 0, 0, end);
8b00: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
8b10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
8b20: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
8b30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8b40: 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
8b50: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
8b60: 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63   }.  }.  .copy_c
8b70: 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e  leanup:.  return
8b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
8b90: 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55  on-standard VACU
8ba0: 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  UM command is us
8bb0: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  ed to clean up t
8bc0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
8bd0: 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70  collapse free sp
8be0: 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73  ace, etc.  It is
8bf0: 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20   modelled after 
8c00: 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  the VACUUM comma
8c10: 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65  nd.** in Postgre
8c20: 53 51 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  SQL..*/.void sql
8c30: 69 74 65 56 61 63 75 75 6d 28 50 61 72 73 65 20  iteVacuum(Parse 
8c40: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8c50: 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63  pTableName){.  c
8c60: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64  har *zName;.  Vd
8c70: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20  be *v;.  sqlite 
8c80: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8c90: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
8ca0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
8cb0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
8cc0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
8cd0: 61 62 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ableName ){.    
8ce0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
8cf0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
8d00: 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20  (pTableName);.  
8d10: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
8d20: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
8d30: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 46  zName && sqliteF
8d40: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
8d50: 6d 65 29 3d 3d 30 0a 20 20 20 20 26 26 20 73 71  me)==0.    && sq
8d60: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62  liteFindTable(db
8d70: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
8d80: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8d90: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8da0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
8db0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c  ble or index: ",
8dc0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
8dd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
8de0: 20 20 20 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f      goto vacuum_
8df0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76  cleanup;.  }.  v
8e00: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
8e10: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
8e20: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 76 61 63 75  v==0 ) goto vacu
8e30: 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66  um_cleanup;.  if
8e40: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
8e50: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
8e60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
8e70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
8e80: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
8e90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
8ea0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8eb0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
8ec0: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
8ed0: 69 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ie, 0, 0, 0);.  
8ee0: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
8ef0: 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Verified = 1;.  
8f00: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  }.  if( zName ){
8f10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
8f20: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67  ddOp(v, OP_Reorg
8f30: 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 7a 4e 61  anize, 0, 0, zNa
8f40: 6d 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  me, 0);.  }else{
8f50: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8f60: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
8f70: 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  x;.    HashElem 
8f80: 2a 70 45 3b 0a 20 20 20 20 66 6f 72 28 70 45 3d  *pE;.    for(pE=
8f90: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8fa0: 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  &db->tblHash); p
8fb0: 45 3b 20 70 45 3d 73 71 6c 69 74 65 48 61 73 68  E; pE=sqliteHash
8fc0: 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20  Next(pE)){.     
8fd0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61   pTab = sqliteHa
8fe0: 73 68 44 61 74 61 28 70 45 29 3b 0a 20 20 20 20  shData(pE);.    
8ff0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9000: 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69  p(v, OP_Reorgani
9010: 7a 65 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  ze, 0, 0, pTab->
9020: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
9030: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9040: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9050: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9060: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
9070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
9080: 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c  eorganize, 0, 0,
9090: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pIdx->zName, 0)
90a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
90b0: 20 20 7d 0a 20 20 69 66 28 20 28 64 62 2d 3e 66    }.  if( (db->f
90c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
90d0: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
90e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
90f0: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
9100: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
9110: 0a 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3a  .vacuum_cleanup:
9120: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
9130: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
9140: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
9150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
9160: 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e  void sqliteBegin
9170: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
9180: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
9190: 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
91a0: 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
91b0: 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
91c0: 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
91d0: 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75  b->pBe==0 ) retu
91e0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
91f0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
9200: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
9210: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64   return;.  if( d
9220: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9230: 45 5f 49 6e 54 72 61 6e 73 20 29 20 72 65 74 75  E_InTrans ) retu
9240: 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  rn;.  v = sqlite
9250: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9260: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
9270: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9280: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
9290: 6e 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  n, 1, 0, 0, 0);.
92a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
92b0: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
92c0: 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65  Cookie, db->sche
92d0: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c  ma_cookie, 0, 0,
92e0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
92f0: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
9300: 3d 20 31 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  = 1;.  }.  db->f
9310: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
9320: 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nTrans;.}../*.**
9330: 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
9340: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
9350: 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61  liteCommitTransa
9360: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
9370: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
9380: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
9390: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
93a0: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
93b0: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
93c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
93d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
93e0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
93f0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
9400: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
9410: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
9420: 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72  rans)==0 ) retur
9430: 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  n;.  v = sqliteG
9440: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9450: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
9460: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9470: 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20  , OP_Commit, 0, 
9480: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
9490: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
94a0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a  LITE_InTrans;.}.
94b0: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
94c0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
94d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c  .void sqliteRoll
94e0: 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
94f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
9500: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
9510: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
9520: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
9530: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
9540: 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20  || db->pBe==0 ) 
9550: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
9560: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
9570: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
9580: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
9590: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
95a0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
95b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
95c0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
95d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
95e0: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  v ){.    sqliteV
95f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
9600: 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 30  ollback, 0, 0, 0
9610: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  , 0);.  }.  db->
9620: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
9630: 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a  _InTrans;.}../*.
9640: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
9650: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
9660: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
9670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9680: 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20  getBoolean(char 
9690: 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *z){.  static ch
96a0: 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b  ar *azTrue[] = {
96b0: 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74   "yes", "on", "t
96c0: 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  rue" };.  int i;
96d0: 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29  .  if( z[0]==0 )
96e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
96f0: 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c   isdigit(z[0]) |
9700: 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  | (z[0]=='-' && 
9710: 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29  isdigit(z[1])) )
9720: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f  {.    return ato
9730: 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  i(z);.  }.  for(
9740: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
9750: 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54  True)/sizeof(azT
9760: 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  rue[0]); i++){. 
9770: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
9780: 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d  ICmp(z,azTrue[i]
9790: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
97a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
97b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  .}../*.** Proces
97c0: 73 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65  s a pragma state
97d0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72  ment.  .**.** Pr
97e0: 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69  agmas are of thi
97f0: 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  s form:.**.**   
9800: 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d 20 76     PRAGMA id = v
9810: 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  alue.**.** The i
9820: 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74 20  dentifier might 
9830: 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e 67  also be a string
9840: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
9850: 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a  a string, and.**
9860: 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20   identifier, or 
9870: 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d 69  a number.  If mi
9880: 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65 2c  nusFlag is true,
9890: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
98a0: 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74  is.** a number t
98b0: 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65 64  hat was preceded
98c0: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
98d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
98e0: 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70 50  Pragma(Parse *pP
98f0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  arse, Token *pLe
9900: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
9910: 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67  t, int minusFlag
9920: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
9930: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52   = 0;.  char *zR
9940: 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ight = 0;.  sqli
9950: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
9960: 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20  >db;..  zLeft = 
9970: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
9980: 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e  eft->z, pLeft->n
9990: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
99a0: 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28  te(zLeft);.  if(
99b0: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
99c0: 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20    zRight = 0;.  
99d0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
99e0: 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c  ng(&zRight, "-",
99f0: 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70   1, pRight->z, p
9a00: 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Right->n, 0);.  
9a10: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
9a20: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
9a30: 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69  p(pRight->z, pRi
9a40: 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ght->n);.    sql
9a50: 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68  iteDequote(zRigh
9a60: 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 69 66 28 20  t);.  }. .  if( 
9a70: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
9a80: 65 66 74 2c 22 63 61 63 68 65 5f 73 69 7a 65 22  eft,"cache_size"
9a90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
9aa0: 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67  size = atoi(zRig
9ab0: 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  ht);.    sqliteB
9ac0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
9ad0: 28 64 62 2d 3e 70 42 65 2c 20 73 69 7a 65 29 3b  (db->pBe, size);
9ae0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
9af0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
9b00: 65 66 74 2c 20 22 76 64 62 65 5f 74 72 61 63 65  eft, "vdbe_trace
9b10: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
9b20: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
9b30: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
9b40: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
9b50: 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20  _VdbeTrace;.    
9b60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
9b70: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
9b80: 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20  E_VdbeTrace;.   
9b90: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
9ba0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28  def NDEBUG.  if(
9bb0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
9bc0: 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72  Left, "parser_tr
9bd0: 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ace")==0 ){.    
9be0: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
9bf0: 74 65 50 61 72 73 65 72 54 72 61 63 65 28 46 49  teParserTrace(FI
9c00: 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20  LE*, char *);.  
9c10: 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
9c20: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
9c30: 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72    sqliteParserTr
9c40: 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72  ace(stdout, "par
9c50: 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ser: ");.    }el
9c60: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9c70: 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30  ParserTrace(0, 0
9c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9c90: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
9ca0: 4c 65 66 74 20 29 20 73 71 6c 69 74 65 46 72 65  Left ) sqliteFre
9cb0: 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  e(zLeft);.  if( 
9cc0: 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 46  zRight ) sqliteF
9cd0: 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a     ree(zRight);.}.