/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fe71d516148226bd6249403e82f8d07129206489:


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 35 30 20 32 30 30  ild.c,v 1.50 200
0320: 31 2f 31 30 2f 31 35 20 30 30 3a 34 34 3a 33 36  1/10/15 00:44:36
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0820: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0830: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0840: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0850: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
0860: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
0870: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0880: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0890: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
08a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
08b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
08c0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
08d0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
08e0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
08f0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0900: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0910: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0920: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0930: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0940: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0950: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0960: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0980: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b    pNew->op = op;
0990: 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d  .  pNew->pLeft =
09a0: 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e   pLeft;.  pNew->
09b0: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
09c0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
09d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
09e0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
09f0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  lse{.    pNew->t
0a00: 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20  oken.z = "";.   
0a10: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d   pNew->token.n =
0a20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
0a30: 65 66 74 20 26 26 20 70 52 69 67 68 74 20 29 7b  eft && pRight ){
0a40: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 53  .    sqliteExprS
0a50: 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74  pan(pNew, &pLeft
0a60: 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d  ->span, &pRight-
0a70: 3e 73 70 61 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  >span);.  }else{
0a80: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20  .    pNew->span 
0a90: 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20  = pNew->token;. 
0aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
0ac0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69  he Expr.token fi
0ad0: 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eld of the given
0ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
0af0: 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20  pan all.** text 
0b00: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
0b10: 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f  given tokens..*/
0b20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
0b30: 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72  Span(Expr *pExpr
0b40: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20  , Token *pLeft, 
0b50: 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a  Token *pRight){.
0b60: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
0b70: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
0b80: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
0b90: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
0ba0: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 69 6e   pRight->n + (in
0bb0: 74 29 70 52 69 67 68 74 2d 3e 7a 20 2d 20 28 69  t)pRight->z - (i
0bc0: 6e 74 29 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 7d  nt)pLeft->z;.  }
0bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
0be0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
0bf0: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
0c00: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
0c10: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
0c20: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
0c30: 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e  liteExprFunction
0c40: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
0c50: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
0c60: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
0c70: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
0c80: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
0c90: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
0ca0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
0cb0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0cc0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
0cd0: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
0ce0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
0cf0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
0d00: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
0d10: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
0d20: 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20  token.z = "";.  
0d30: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20    pNew->token.n 
0d40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0d50: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0d60: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
0d70: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
0d80: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
0d90: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
0da0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
0db0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0dc0: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
0dd0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
0de0: 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  e(p->pLeft);.  i
0df0: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73  f( p->pRight ) s
0e00: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0e10: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66  p->pRight);.  if
0e20: 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c  ( p->pList ) sql
0e30: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
0e40: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69  e(p->pList);.  i
0e50: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20  f( p->pSelect ) 
0e60: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
0e70: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
0e80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
0ea0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
0eb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
0ec0: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
0ed0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
0ee0: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  e table given th
0ef0: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61  e name.** of tha
0f00: 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  t table.  Return
0f10: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
0f20: 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  nd..*/.Table *sq
0f30: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71  liteFindTable(sq
0f40: 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a  lite *db, char *
0f50: 7a 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  zName){.  Table 
0f60: 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46  *p = sqliteHashF
0f70: 69 6e 64 28 26 64 62 2d 3e 74 62 6c 48 61 73 68  ind(&db->tblHash
0f80: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
0f90: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 72 65 74  zName)+1);.  ret
0fa0: 75 72 6e 20 28 70 3d 3d 30 20 7c 7c 20 70 2d 3e  urn (p==0 || p->
0fb0: 69 73 44 65 6c 65 74 65 29 20 3f 20 30 20 3a 20  isDelete) ? 0 : 
0fc0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0fd0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0fe0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0ff0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1000: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1010: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1020: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
1030: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1040: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
1050: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
1060: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1070: 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  , char *zName){.
1080: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73 71 6c    Index *p = sql
1090: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
10a0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
10b0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
10c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 3d 3d  );.  return (p==
10d0: 30 20 7c 7c 20 70 2d 3e 69 73 44 65 6c 65 74 65  0 || p->isDelete
10e0: 29 20 3f 20 30 20 3a 20 70 3b 0a 7d 0a 0a 2f 2a  ) ? 0 : p;.}../*
10f0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67  .** Remove the g
1100: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
1110: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
1120: 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a  able, and free.*
1130: 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72  * its memory str
1140: 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  uctures..**.** T
1150: 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f  he index is remo
1160: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
1170: 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65  abase hash table
1180: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 0a 2a 2a   if db!=NULL..**
1190: 20 42 75 74 20 74 68 65 20 69 6e 64 65 78 20 69   But the index i
11a0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
11b0: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
11c0: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
11d0: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
11e0: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
11f0: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
1200: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
1210: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1220: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
1230: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1240: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1250: 69 66 28 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  if( pIndex->zNam
1260: 65 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 73  e && db ){.    s
1270: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1280: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49  &db->idxHash, pI
1290: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
12a0: 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
12b0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e)+1, 0);.  }.  
12c0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
12d0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  x);.}../*.** Unl
12e0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ink the given in
12f0: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62  dex from its tab
1300: 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a  le, then remove.
1310: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ** the index fro
1320: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
1330: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
1340: 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74  its memory.** st
1350: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  ructures..*/.sta
1360: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55  tic void sqliteU
1370: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1380: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
1390: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
13a0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
13b0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
13c0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64  ndex ){.    pInd
13d0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
13e0: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
13f0: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
1400: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66   Index *p;.    f
1410: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
1420: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
1430: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
1440: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
1450: 7d 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70  }.    if( p && p
1460: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
1470: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
1480: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
1490: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
14a0: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
14b0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a  (db, pIndex);.}.
14c0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
14d0: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
14e0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
14f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
1500: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
1510: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
1520: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
1530: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
1550: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
1560: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
1570: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
1580: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
1590: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
15a0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
15b0: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
15c0: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
15d0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
15e0: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73   the indices ass
15f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1600: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   table..**.** In
1610: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
1620: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1630: 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  are unlinked fro
1640: 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61  m the "db".** da
1650: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
1660: 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62  db!=NULL.  If db
1670: 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20  ==NULL, indices 
1680: 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74  attached to.** t
1690: 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c  he table are del
16a0: 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  eted, but it is 
16b0: 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76  assumed they hav
16c0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  e already been.*
16d0: 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76  * unlinked..*/.v
16e0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
16f0: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
1700: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
1710: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64  {.  int i;.  Ind
1720: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
1730: 78 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  xt;.  if( pTable
1740: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1750: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
1760: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
1770: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
1780: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  able->aCol[i].zN
1790: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
17a0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
17b0: 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20  l[i].zDflt);.   
17c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
17d0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  le->aCol[i].zTyp
17e0: 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49  e);.  }.  for(pI
17f0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
1800: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1810: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
1820: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
1830: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
1840: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1850: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
1860: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1870: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
1880: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1890: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
18a0: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
18b0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
18c0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
18d0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
18e0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
18f0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
1900: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
1910: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 0a 2a  l its indices..*
1920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1930: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
1940: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
1950: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
1960: 6c 65 29 7b 0a 20 20 69 66 28 20 70 54 61 62 6c  le){.  if( pTabl
1970: 65 2d 3e 7a 4e 61 6d 65 20 26 26 20 64 62 20 29  e->zName && db )
1980: 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  {.    sqliteHash
1990: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
19a0: 61 73 68 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ash, pTable->zNa
19b0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 54 61 62 6c  me, strlen(pTabl
19c0: 65 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  e->zName)+1, 0);
19d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
19e0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
19f0: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ble);.}../*.** C
1a00: 68 65 63 6b 20 61 6c 6c 20 54 61 62 6c 65 73 20  heck all Tables 
1a10: 61 6e 64 20 49 6e 64 65 78 65 73 20 69 6e 20 74  and Indexes in t
1a20: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
1a30: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6d 6d 69   table and commi
1a40: 74 0a 2a 2a 20 61 6e 79 20 61 64 64 69 74 69 6f  t.** any additio
1a50: 6e 73 20 6f 72 20 64 65 6c 65 74 69 6f 6e 73 20  ns or deletions 
1a60: 74 6f 20 74 68 6f 73 65 20 68 61 73 68 20 74 61  to those hash ta
1a70: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  bles..**.** When
1a80: 20 65 78 65 63 75 74 69 6e 67 20 43 52 45 41 54   executing CREAT
1a90: 45 20 54 41 42 4c 45 20 61 6e 64 20 43 52 45 41  E TABLE and CREA
1aa0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1ab0: 6e 74 73 2c 20 74 68 65 20 54 61 62 6c 65 0a 2a  nts, the Table.*
1ac0: 2a 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72 75  * and Index stru
1ad0: 63 74 75 72 65 73 20 61 72 65 20 63 72 65 61 74  ctures are creat
1ae0: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
1af0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 2c  the hash tables,
1b00: 20 62 75 74 0a 2a 2a 20 74 68 65 20 22 69 73 43   but.** the "isC
1b10: 6f 6d 6d 69 74 22 20 66 69 65 6c 64 20 69 73 20  ommit" field is 
1b20: 6e 6f 74 20 73 65 74 2e 20 20 54 68 69 73 20 72  not set.  This r
1b30: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 6f 73  outine sets thos
1b40: 65 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 57 68 65  e fields..** Whe
1b50: 6e 20 65 78 65 63 75 74 69 6e 67 20 44 52 4f 50  n executing DROP
1b60: 20 54 41 42 4c 45 20 61 6e 64 20 44 52 4f 50 20   TABLE and DROP 
1b70: 49 4e 44 45 58 2c 20 74 68 65 20 22 69 73 44 65  INDEX, the "isDe
1b80: 6c 65 74 65 22 20 66 69 65 6c 64 73 20 6f 66 0a  lete" fields of.
1b90: 2a 2a 20 54 61 62 6c 65 20 61 6e 64 20 49 6e 64  ** Table and Ind
1ba0: 65 78 20 73 74 72 75 63 74 75 72 65 73 20 69 73  ex structures is
1bb0: 20 73 65 74 20 62 75 74 20 74 68 65 20 73 74 72   set but the str
1bc0: 75 63 74 75 72 65 73 20 61 72 65 20 6e 6f 74 20  uctures are not 
1bd0: 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 20 66 72 6f 6d  unlinked.** from
1be0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
1bf0: 20 6e 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64   nor deallocated
1c00: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1c10: 68 61 6e 64 6c 65 73 20 74 68 61 74 0a 2a 2a 20  handles that.** 
1c20: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 0a 2a  deallocation. .*
1c30: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
1c40: 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74  qliteRollbackInt
1c50: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a  ernalChanges().*
1c60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d  /.void sqliteCom
1c70: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
1c80: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
1c90: 20 20 48 61 73 68 20 74 6f 44 65 6c 65 74 65 3b    Hash toDelete;
1ca0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
1cb0: 65 6d 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  em;.  if( (db->f
1cc0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
1cd0: 74 65 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20  ternChanges)==0 
1ce0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1cf0: 74 65 48 61 73 68 49 6e 69 74 28 26 74 6f 44 65  teHashInit(&toDe
1d00: 6c 65 74 65 2c 20 53 51 4c 49 54 45 5f 48 41 53  lete, SQLITE_HAS
1d10: 48 5f 50 4f 49 4e 54 45 52 2c 20 30 29 3b 0a 20  H_POINTER, 0);. 
1d20: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
1d30: 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  ie = db->next_co
1d40: 6f 6b 69 65 3b 0a 20 20 66 6f 72 28 70 45 6c 65  okie;.  for(pEle
1d50: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1d60: 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b  t(&db->tblHash);
1d70: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1d80: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1d90: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1da0: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1db0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1dc0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
1dd0: 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  >isDelete ){.   
1de0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
1df0: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
1e00: 54 61 62 6c 65 2c 20 30 2c 20 70 54 61 62 6c 65  Table, 0, pTable
1e10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 69 73 43 6f      pTable->isCo
1e30: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  mmit = 1;.    }.
1e40: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
1e50: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1e60: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
1e70: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
1e80: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
1e90: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1ea0: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
1eb0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
1ec0: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
1ed0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1ee0: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
1ef0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
1f00: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
1f10: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
1f20: 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61  First(&db->idxHa
1f30: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
1f40: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1f50: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
1f60: 62 6c 65 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  ble *pIndex = sq
1f70: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1f80: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  em);.    if( pIn
1f90: 64 65 78 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  dex->isDelete ){
1fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
1fb0: 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65 74  hInsert(&toDelet
1fc0: 65 2c 20 70 49 6e 64 65 78 2c 20 30 2c 20 70 49  e, pIndex, 0, pI
1fd0: 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ndex);.    }else
1fe0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1ff0: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
2000: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45    }.  }.  for(pE
2010: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2020: 72 73 74 28 26 74 6f 44 65 6c 65 74 65 29 3b 20  rst(&toDelete); 
2030: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2040: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2050: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
2060: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48  pIndex = sqliteH
2070: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2080: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
2090: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
20a0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
20b0: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
20c0: 72 28 26 74 6f 44 65 6c 65 74 65 29 3b 0a 20 20  r(&toDelete);.  
20d0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
20e0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
20f0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
2100: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
2110: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
2120: 43 52 45 41 54 45 20 54 41 42 4c 45 2c 20 43 52  CREATE TABLE, CR
2130: 45 41 54 45 20 49 4e 44 45 58 2c 0a 2a 2a 20 44  EATE INDEX,.** D
2140: 52 4f 50 20 54 41 42 4c 45 2c 20 6f 72 20 44 52  ROP TABLE, or DR
2150: 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
2160: 6e 74 73 20 67 65 74 73 20 72 6f 6c 6c 65 64 20  nts gets rolled 
2170: 62 61 63 6b 2e 20 20 54 68 65 0a 2a 2a 20 61 64  back.  The.** ad
2180: 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65 74  ditions or delet
2190: 69 6f 6e 73 20 6f 66 20 54 61 62 6c 65 20 61 6e  ions of Table an
21a0: 64 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  d Index structur
21b0: 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 74  es in the.** int
21c0: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
21d0: 73 20 61 72 65 20 75 6e 64 6f 6e 65 2e 0a 2a 2a  s are undone..**
21e0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
21f0: 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  liteCommitIntern
2200: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
2210: 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61  oid sqliteRollba
2220: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
2230: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2240: 20 48 61 73 68 20 74 6f 44 65 6c 65 74 65 3b 0a   Hash toDelete;.
2250: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2260: 6d 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  m;.  if( (db->fl
2270: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
2280: 65 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20 29  ernChanges)==0 )
2290: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
22a0: 65 48 61 73 68 49 6e 69 74 28 26 74 6f 44 65 6c  eHashInit(&toDel
22b0: 65 74 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ete, SQLITE_HASH
22c0: 5f 50 4f 49 4e 54 45 52 2c 20 30 29 3b 0a 20 20  _POINTER, 0);.  
22d0: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20  db->next_cookie 
22e0: 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  = db->schema_coo
22f0: 6b 69 65 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  kie;.  for(pElem
2300: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2310: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  (&db->tblHash); 
2320: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2330: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2340: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
2350: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 48  pTable = sqliteH
2360: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2370: 20 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d      if( !pTable-
2380: 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  >isCommit ){.   
2390: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
23a0: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
23b0: 54 61 62 6c 65 2c 20 30 2c 20 70 54 61 62 6c 65  Table, 0, pTable
23c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23d0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 69 73 44 65      pTable->isDe
23e0: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lete = 0;.    }.
23f0: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
2400: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2410: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
2420: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2430: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2440: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2450: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
2460: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2470: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2480: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2490: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
24a0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
24b0: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
24c0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
24d0: 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61  First(&db->idxHa
24e0: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
24f0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2500: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
2510: 62 6c 65 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  ble *pIndex = sq
2520: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2530: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49  em);.    if( !pI
2540: 6e 64 65 78 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  ndex->isCommit )
2550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
2560: 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65  shInsert(&toDele
2570: 74 65 2c 20 70 49 6e 64 65 78 2c 20 30 2c 20 70  te, pIndex, 0, p
2580: 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73  Index);.    }els
2590: 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e{.      pIndex-
25a0: 3e 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20  >isDelete = 0;. 
25b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
25c0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
25d0: 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65 29 3b  irst(&toDelete);
25e0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
25f0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
2600: 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
2610: 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  *pIndex = sqlite
2620: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
2630: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
2640: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
2650: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
2660: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
2670: 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b 0a 20  ar(&toDelete);. 
2680: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2690: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
26a0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ges;.}../*.** Co
26b0: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
26c0: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
26d0: 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61   or index from a
26e0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
26f0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2700: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
2710: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
2720: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
2730: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
2740: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2750: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
2760: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
2770: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
2780: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
2790: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
27a0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
27b0: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
27c0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
27d0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
27e0: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
27f0: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
2800: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
2810: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
2820: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
2830: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
2840: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
2850: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
2860: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
2870: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
2880: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
2890: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
28a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
28b0: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
28c0: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
28d0: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
28e0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
28f0: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
2900: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
2910: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
2920: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
2930: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
2940: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
2950: 20 69 66 20 74 68 65 20 22 54 45 4d 50 22 20 6f   if the "TEMP" o
2960: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
2970: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
2980: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
2990: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
29a0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
29b0: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
29c0: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
29d0: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
29e0: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
29f0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
2a00: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
2a10: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
2a20: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
2a30: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
2a40: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
2a50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2a60: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
2a70: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
2a80: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
2a90: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
2aa0: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
2ab0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2ac0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
2ad0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
2ae0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
2af0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
2b00: 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  id sqliteStartTa
2b10: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
2b20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  e, Token *pStart
2b30: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
2b40: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54  int isTemp){.  T
2b50: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
2b60: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
2b70: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
2b80: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
2b90: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
2ba0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69  ;..  pParse->sFi
2bb0: 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61  rstToken = *pSta
2bc0: 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  rt;.  zName = sq
2bd0: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
2be0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
2bf0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
2c00: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
2c10: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63  fore trying to c
2c20: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2c30: 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75  y table, make su
2c40: 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72  re the Btree for
2c50: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65  .  ** holding te
2c60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69  mporary tables i
2c70: 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  s open..  */.  i
2c80: 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d  f( isTemp && db-
2c90: 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  >pBeTemp==0 ){. 
2ca0: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2cb0: 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  teBtreeOpen(0, 0
2cc0: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
2cd0: 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
2ce0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cf0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2d00: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2d10: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
2d20: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
2d30: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
2d40: 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
2d50: 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
2d60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
2d70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
2d80: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
2d90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2da0: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
2db0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
2dc0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
2dd0: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
2de0: 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65 54 65  nTrans(db->pBeTe
2df0: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
2e00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
2e20: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
2e30: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
2e40: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
2e50: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
2e60: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
2e70: 72 61 72 79 20 64 61 74 62 61 73 65 20 66 69 6c  rary datbase fil
2e80: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2e90: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
2ea0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ec0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
2ed0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
2ee0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
2ef0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
2f00: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
2f10: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e  x or table name.
2f20: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
2f30: 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 64   message if it d
2f40: 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oes..  **.  ** I
2f50: 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61 64  f we are re-read
2f60: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
2f70: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
2f80: 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a  use of a schema.
2f90: 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20    ** change and 
2fa0: 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20  a new permanent 
2fb0: 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77  table is found w
2fc0: 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64  hose name collid
2fd0: 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  es with.  ** an 
2fe0: 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61  existing tempora
2ff0: 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69  ry table, then i
3000: 67 6e 6f 72 65 20 74 68 65 20 6e 65 77 20 70 65  gnore the new pe
3010: 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20  rmanent table.. 
3020: 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74   ** We will cont
3030: 69 6e 75 65 20 70 61 72 73 69 6e 67 2c 20 62 75  inue parsing, bu
3040: 74 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 61  t the pParse->na
3050: 6d 65 43 6c 61 73 68 20 66 6c 61 67 20 77 69 6c  meClash flag wil
3060: 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f  l be set.  ** so
3070: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f   we will know to
3080: 20 64 69 73 63 61 72 64 20 74 68 65 20 74 61 62   discard the tab
3090: 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63 65 20 70  le record once p
30a0: 61 72 73 69 6e 67 20 68 61 73 20 66 69 6e 69 73  arsing has finis
30b0: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  hed..  */.  pTab
30c0: 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  le = sqliteFindT
30d0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  able(db, zName);
30e0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
30f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62   ){.    if( pTab
3100: 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50  le->isTemp && pP
3110: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
3120: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
3130: 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20  nameClash = 1;. 
3140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3150: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3160: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3170: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20  g, "table ", 0, 
3180: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3190: 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20  >n,.          " 
31a0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
31b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
31c0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
31d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
31e0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
31f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  urn;.    }.  }el
3200: 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  se{.    pParse->
3210: 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20  nameClash = 0;. 
3220: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
3230: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
3240: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
3250: 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 21 70  &&.          (!p
3260: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54  Idx->pTable->isT
3270: 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e  emp || !pParse->
3280: 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20  initFlag) ){.   
3290: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
32a0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
32b0: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
32c0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
32d0: 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a  med ", .       z
32e0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
32f0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
3300: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3310: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
3320: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
3330: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
3340: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
3350: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
3360: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
3370: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
3380: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
3390: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
33a0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
33b0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  le->pIndex = 0;.
33c0: 20 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70    pTable->isTemp
33d0: 20 3d 20 69 73 54 65 6d 70 3b 0a 20 20 69 66 28   = isTemp;.  if(
33e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
33f0: 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74  le ) sqliteDelet
3400: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
3410: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
3420: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
3430: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 69  le = pTable;.  i
3440: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
3450: 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73 71 6c  Flag && (v = sql
3460: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
3470: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  e))!=0 ){.    if
3480: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
3490: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
34a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
34b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
34c0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
34d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
34e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
34f0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64  _VerifyCookie, d
3500: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
3510: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
3520: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
3530: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
3540: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
3550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3560: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
3570: 6e 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20  nWrite, 0, 2);. 
3580: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
3590: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d  hangeP3(v, -1, M
35a0: 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53  ASTER_NAME, P3_S
35b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
35c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
35d0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
35e0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
35f0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
3600: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
3610: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3620: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
3630: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
3640: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
3650: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
3660: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
3670: 74 65 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  teStartTable() g
3680: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
3690: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
36a0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
36b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
36c0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
36d0: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
36e0: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
36f0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
3700: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
3710: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 68    Table *p;.  ch
3720: 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  ar **pz;.  if( (
3730: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
3740: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
3750: 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43  rn;.  if( (p->nC
3760: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
3770: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 73 71      p->aCol = sq
3780: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
3790: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
37a0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
37b0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
37c0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->aCol==0 ){.   
37d0: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a     p->nCol = 0;.
37e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
37f0: 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74    }.  }.  memset
3800: 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  (&p->aCol[p->nCo
3810: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  l], 0, sizeof(p-
3820: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 7a  >aCol[0]));.  pz
3830: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
3840: 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col++].zName;.  
3850: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3860: 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  (pz, pName->z, p
3870: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 73  Name->n, 0);.  s
3880: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
3890: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
38a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
38b0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
38c0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
38d0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
38e0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
38f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
3900: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
3910: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
3920: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
3930: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
3940: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
3950: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
3960: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
3970: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
3980: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3990: 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28  qliteAddNotNull(
39a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
39b0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
39c0: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
39d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
39e0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
39f0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
3a00: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
3a10: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
3a20: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 1;.}../*.** T
3a30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3a40: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3a50: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
3a60: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
3a70: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
3a80: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3a90: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
3aa0: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
3ab0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
3ac0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
3ad0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
3ae0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
3af0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
3b00: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
3b10: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
3b20: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
3b30: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
3b40: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
3b50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
3b60: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
3b70: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
3b80: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
3b90: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
3ba0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
3bb0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
3bc0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
3bd0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
3be0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
3bf0: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
3c00: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62  n *pLast){.  Tab
3c10: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20  le *p;.  int i, 
3c20: 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  j;.  int n;.  ch
3c30: 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 69  ar *z, **pz;.  i
3c40: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
3c50: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
3c60: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
3c70: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
3c80: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
3c90: 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  z = &p->aCol[i].
3ca0: 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61  zType;.  n = pLa
3cb0: 73 74 2d 3e 6e 20 2b 20 28 28 69 6e 74 29 70 4c  st->n + ((int)pL
3cc0: 61 73 74 2d 3e 7a 29 20 2d 20 28 69 6e 74 29 70  ast->z) - (int)p
3cd0: 46 69 72 73 74 2d 3e 7a 3b 0a 20 20 73 71 6c 69  First->z;.  sqli
3ce0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
3cf0: 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30   pFirst->z, n, 0
3d00: 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20  );.  z = *pz;.  
3d10: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
3d20: 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  n;.  for(i=j=0; 
3d30: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
3d40: 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  int c = z[i];.  
3d50: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
3d60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3d70: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
3d80: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[j] = 0;.}..
3d90: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
3da0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
3db0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
3dc0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
3dd0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
3de0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
3df0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
3e00: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
3e10: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
3e20: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
3e30: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
3e40: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
3e50: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sign..**.** This
3e60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3e70: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
3e80: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
3e90: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
3ea0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
3eb0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
3ec0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 44 65  void sqliteAddDe
3ed0: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
3ee0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
3ef0: 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73  *pVal, int minus
3f00: 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Flag){.  Table *
3f10: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
3f20: 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  ar **pz;.  if( (
3f30: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
3f40: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
3f50: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
3f60: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
3f70: 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20   return;.  pz = 
3f80: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  &p->aCol[i].zDfl
3f90: 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c  t;.  if( minusFl
3fa0: 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
3fb0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22  SetNString(pz, "
3fc0: 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20  -", 1, pVal->z, 
3fd0: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
3fe0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
3ff0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
4000: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
4010: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
4020: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d  eDequote(*pz);.}
4030: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
4040: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
4050: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
4060: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
4070: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
4080: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
4090: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
40a0: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
40b0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
40c0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
40d0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
40e0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
40f0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
4100: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
4110: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
4120: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
4130: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
4140: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
4150: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
4160: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
4170: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
4180: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
4190: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
41a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
41b0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
41c0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
41d0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
41e0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
41f0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
4200: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
4210: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
4220: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
4230: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
4240: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
4250: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
4260: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
4270: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
4280: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
4290: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
42a0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
42b0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
42c0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
42d0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
42e0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
42f0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
4300: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
4310: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
4320: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
4330: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74   enough..*/.stat
4340: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 43 6f  ic void changeCo
4350: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 29  okie(sqlite *db)
4360: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
4370: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68  _cookie==db->sch
4380: 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20  ema_cookie ){.  
4390: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
43a0: 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  e = db->schema_c
43b0: 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61  ookie + sqliteRa
43c0: 6e 64 6f 6d 42 79 74 65 28 64 62 29 20 2b 20 31  ndomByte(db) + 1
43d0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
43e0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
43f0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
4400: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4410: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
4420: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
4430: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
4440: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
4450: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4460: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
4470: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
4480: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
4490: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
44a0: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
44b0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
44c0: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
44d0: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
44e0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
44f0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
4500: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
4510: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
4520: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
4530: 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c   on disk,.** unl
4540: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 74 65  ess this is a te
4550: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
4560: 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57   initFlag==1.  W
4570: 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c  hen initFlag==1,
4580: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
4590: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
45a0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
45b0: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
45c0: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
45d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
45e0: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
45f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
4600: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
4610: 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20  tly changes, so 
4620: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
4630: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
4640: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
4650: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
4660: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
4670: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
4680: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f   it again..*/.vo
4690: 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  id sqliteEndTabl
46a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
46b0: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20   Token *pEnd){. 
46c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
46d0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
46e0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 6e  ->db;..  if( pEn
46f0: 64 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  d==0 || pParse->
4700: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
4710: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
4720: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
4730: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
4740: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4750: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74  urn;..  /* Add t
4760: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
4770: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
4780: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4790: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
47a0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
47b0: 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c  >nameClash==0 ||
47c0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
47d0: 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50  g==1 );.  if( pP
47e0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
47f0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65   && pParse->name
4800: 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Clash==0 ){.    
4810: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
4820: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  (&db->tblHash, p
4830: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
4840: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
4850: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
4860: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
4870: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
4880: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
4890: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
48a0: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ges;.  }..  /* I
48b0: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
48c0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
48d0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
48e0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
48f0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
4900: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
4910: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
4920: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
4930: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
4940: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
4950: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
4960: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
4970: 65 20 0a 20 20 2a 2a 20 70 50 61 72 73 65 2d 3e  e .  ** pParse->
4980: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
4990: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
49a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
49b0: 6e 20 70 75 74 0a 20 20 2a 2a 20 74 68 65 72 65  n put.  ** there
49c0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
49d0: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
49e0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
49f0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
4a00: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72    p->tnum = pPar
4a10: 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  se->newTnum;.  }
4a20: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
4a30: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
4a40: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
4a50: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
4a60: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
4a70: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
4a80: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
4a90: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
4aa0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
4ab0: 52 41 52 59 20 74 61 62 6c 65 2c 20 74 68 65 6e  RARY table, then
4ac0: 20 6a 75 73 74 20 63 72 65 61 74 65 20 74 68 65   just create the
4ad0: 20 74 61 62 6c 65 2e 20 20 44 6f 20 6e 6f 74 0a   table.  Do not.
4ae0: 20 20 2a 2a 20 6d 61 6b 65 20 61 6e 20 65 6e 74    ** make an ent
4af0: 72 79 20 69 6e 20 53 51 4c 49 54 45 5f 4d 41 53  ry in SQLITE_MAS
4b00: 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  TER..  */.  if( 
4b10: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
4b20: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 2c 20  g ){.    int n, 
4b30: 61 64 64 72 3b 0a 20 20 20 20 56 64 62 65 20 2a  addr;.    Vdbe *
4b40: 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  v;..    v = sqli
4b50: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
4b60: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
4b70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20  ) return;.    n 
4b80: 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d  = (int)pEnd->z -
4b90: 20 28 69 6e 74 29 70 50 61 72 73 65 2d 3e 73 46   (int)pParse->sF
4ba0: 69 72 73 74 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  irstToken.z + 1;
4bb0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54  .    if( !p->isT
4bc0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
4bd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4be0: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
4bf0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4c00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c10: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
4c20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
4c30: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
4c40: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
4c50: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
4c60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c70: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
4c80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
4c90: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
4ca0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
4cb0: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
4cc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4cd0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4cf0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
4d00: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  p->zName, P3_STA
4d10: 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
4d20: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
4d30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
4d40: 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b  ateTable, 0, 0);
4d50: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
4d60: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
4d70: 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75   (char *)&p->tnu
4d80: 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  m, P3_POINTER);.
4d90: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b      p->tnum = 0;
4da0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54  .    if( !p->isT
4db0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64  emp ){.      add
4dc0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
4dd0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4de0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4df0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
4e00: 33 28 76 2c 20 61 64 64 72 2c 20 70 50 61 72 73  3(v, addr, pPars
4e10: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
4e20: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
4e30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4e40: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
4e50: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4e60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4e70: 5f 50 75 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Put, 0, 0);.   
4e80: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
4e90: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
4ea0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4eb0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e  _SetCookie, db->
4ec0: 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  next_cookie, 0);
4ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4ee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
4ef0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  se, 0, 0);.    }
4f00: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
4f10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
4f20: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
4f30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4f40: 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
4f50: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
4f70: 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70  a token, look up
4f80: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
4f90: 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74  at name.  If not
4fa0: 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a   found, leave.**
4fb0: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68   an error for th
4fc0: 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64  e parser to find
4fd0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4fe0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
4ff0: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
5000: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5010: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
5020: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
5030: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e  able *pTab;.  zN
5040: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
5050: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
5060: 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Tok);.  if( zNam
5070: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
5080: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
5090: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
50a0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
50b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
50c0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
50d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
50e0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
50f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
5100: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c  uch table: ", 0,
5110: 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e   .        pTok->
5120: 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a  z, pTok->n, 0);.
5130: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5140: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
5150: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
5160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5170: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
5180: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
5190: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
51a0: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
51b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
51c0: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
51d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
51e0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
51f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5200: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
5210: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
5220: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
5230: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
5240: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
5250: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
5260: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
5270: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5280: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
5290: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
52a0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b  (pParse, pName);
52b0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
52c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
52d0: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
52e0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
52f0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
5300: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
5310: 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e ", pTable->zNa
5320: 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61  me, .       " ma
5330: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
5340: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
5350: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
5360: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
5370: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5380: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
5390: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
53a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
53b0: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
53c0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
53d0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
53e0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
53f0: 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b  dbeOp dropTable[
5400: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
5410: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20  _OpenWrite,  0, 
5420: 32 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45 52  2,        MASTER
5430: 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20  _NAME},.      { 
5440: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
5450: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
5460: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
5470: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
5480: 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a      0}, /* 2 */.
5490: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
54a0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
54b0: 29 2c 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a  ),  0}, /* 3 */.
54c0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
54d0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
54e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
54f0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
5500: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
5510: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
5520: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
5530: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
5540: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
5550: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
5560: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
5570: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
5580: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
5590: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30  OP_SetCookie,  0
55a0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
55b0: 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 9 */.      { 
55c0: 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30  OP_Close,      0
55d0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
55e0: 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78      };.    Index
55f0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 66 28 20   *pIdx;.    if( 
5600: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
5610: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
5620: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
5630: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
5640: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
5650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
5670: 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d  erifyCookie, db-
5680: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20  >schema_cookie, 
5690: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
56a0: 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64  ->schemaVerified
56b0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
56c0: 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 73 54  if( !pTable->isT
56d0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61 73  emp ){.      bas
56e0: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
56f0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
5700: 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c  Size(dropTable),
5710: 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20   dropTable);.   
5720: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
5730: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c  ngeP3(v, base+2,
5740: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
5750: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
5760: 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64    changeCookie(d
5770: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
5780: 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
5790: 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78 74  base+9, db->next
57a0: 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a  _cookie);.    }.
57b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
57c0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
57d0: 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c  y, pTable->tnum,
57e0: 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29   pTable->isTemp)
57f0: 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
5800: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
5810: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
5820: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 71  pNext){.      sq
5830: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5840: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64   OP_Destroy, pId
5850: 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d  x->tnum, pTable-
5860: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a  >isTemp);.    }.
5870: 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61      if( (db->fla
5880: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
5890: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ans)==0 ){.     
58a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
58b0: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
58c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
58d0: 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 69  .  /* Mark the i
58e0: 6e 2d 6d 65 6d 6f 72 79 20 54 61 62 6c 65 20 73  n-memory Table s
58f0: 74 72 75 63 74 75 72 65 20 61 73 20 62 65 69 6e  tructure as bein
5900: 67 20 64 65 6c 65 74 65 64 2e 20 20 54 68 65 20  g deleted.  The 
5910: 61 63 74 75 61 6c 6c 79 0a 20 20 2a 2a 20 64 65  actually.  ** de
5920: 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73 20 69 6e  letion occurs in
5930: 73 69 64 65 20 6f 66 20 73 71 6c 69 74 65 43 6f  side of sqliteCo
5940: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
5950: 67 65 73 28 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ges()..  **.  **
5960: 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74   Exception: if t
5970: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
5980: 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20   began with the 
5990: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c  EXPLAIN keyword,
59a0: 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68  .  ** then no ch
59b0: 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  anges should be 
59c0: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  made..  */.  if(
59d0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
59e0: 6e 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  n ){.    pTable-
59f0: 3e 69 73 44 65 6c 65 74 65 20 3d 20 31 3b 0a 20  >isDelete = 1;. 
5a00: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
5a10: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
5a20: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
5a30: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
5a40: 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
5a50: 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20   table.  pIndex 
5a60: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
5a70: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
5a80: 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e   pTable is the n
5a90: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5aa0: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
5ab0: 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
5ac0: 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
5ad0: 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
5ae0: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
5af0: 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
5b00: 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
5b10: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
5b20: 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
5b30: 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
5b40: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
5b50: 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
5b60: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
5b70: 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
5b80: 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
5b90: 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
5ba0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
5bb0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
5bc0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5bd0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
5be0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
5bf0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
5c00: 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
5c10: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
5c20: 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
5c30: 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
5c40: 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
5c50: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
5c60: 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
5c70: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
5c80: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
5c90: 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
5ca0: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
5cb0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
5cc0: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c  pParse,   /* All
5cd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5ce0: 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
5cf0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
5d00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5d10: 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62  he index.  May b
5d20: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
5d30: 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20  n *pTable,   /* 
5d40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
5d50: 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65  e to index.  Use
5d60: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5d70: 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c  le if 0 */.  IdL
5d80: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
5d90: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
5da0: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
5db0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 69 71   */.  int isUniq
5dc0: 75 65 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ue,    /* True i
5dd0: 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  f all entries in
5de0: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 75 73 74   this index must
5df0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
5e00: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
5e10: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
5e20: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
5e30: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5e40: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
5e50: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
5e60: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
5e70: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
5e80: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
5e90: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
5ea0: 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
5eb0: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
5ec0: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
5ed0: 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  ndex;   /* The i
5ee0: 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
5ef0: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
5f00: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
5f10: 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
5f20: 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lId;            
5f30: 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
5f40: 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
5f50: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20  ist */.  sqlite 
5f60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5f70: 3b 0a 20 20 69 6e 74 20 68 69 64 65 4e 61 6d 65  ;.  int hideName
5f80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5f90: 20 44 6f 20 6e 6f 74 20 70 75 74 20 74 61 62 6c   Do not put tabl
5fa0: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61  e name in the ha
5fb0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  sh table */..  i
5fc0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5fd0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
5fe0: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
5ff0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
6000: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
6010: 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
6020: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
6030: 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
6040: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
6050: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
6060: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
6070: 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( pName!=0 );. 
6080: 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74     pTab =  sqlit
6090: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
60a0: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b  pParse, pTable);
60b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
60c0: 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
60d0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
60e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
60f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d  .  }.  if( pTab=
6100: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
6110: 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
6120: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
6130: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
6140: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
6150: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
6160: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
6170: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
6180: 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e  , .      " may n
6190: 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69  ot have new indi
61a0: 63 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a  ces added", 0);.
61b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
61c0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
61d0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
61e0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
61f0: 73 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  s index is creat
6200: 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64  ed while re-read
6210: 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61 20 66  ing the schema f
6220: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
6230: 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74  r.  ** but the t
6240: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
6250: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
6260: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
6270: 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a  able, it can.  *
6280: 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74  * only mean that
6290: 20 74 68 65 20 74 61 62 6c 65 20 74 68 69 73 20   the table this 
62a0: 69 6e 64 65 78 20 69 73 20 72 65 61 6c 6c 79 20  index is really 
62b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
62c0: 69 73 20 6f 6e 65 20 0a 20 20 2a 2a 20 77 68 6f  is one .  ** who
62d0: 73 65 20 6e 61 6d 65 20 69 73 20 68 69 64 64 65  se name is hidde
62e0: 6e 20 62 65 68 69 6e 64 20 61 20 74 65 6d 70 6f  n behind a tempo
62f0: 72 61 72 79 20 74 61 62 6c 65 20 77 69 74 68 20  rary table with 
6300: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20  the same name.. 
6310: 20 2a 2a 20 53 69 6e 63 65 20 69 74 73 20 74 61   ** Since its ta
6320: 62 6c 65 20 68 61 73 20 62 65 65 6e 20 73 75 70  ble has been sup
6330: 70 72 65 73 73 65 64 2c 20 77 65 20 6e 65 65 64  pressed, we need
6340: 20 74 6f 20 61 6c 73 6f 20 73 75 70 70 72 65 73   to also suppres
6350: 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  s the.  ** index
6360: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
6370: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
6380: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b   pTab->isTemp ){
6390: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
63a0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
63b0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
63c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
63d0: 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
63e0: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
63f0: 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
6400: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
6410: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
6420: 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
6430: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
6440: 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
6450: 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
6460: 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
6470: 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
6480: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
6490: 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
64a0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
64b0: 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
64c0: 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
64d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
64e0: 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
64f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
6500: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
6510: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
6520: 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
6530: 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
6540: 68 69 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77  his index, but w
6550: 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  e will not.  ** 
6560: 73 74 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69  store its name i
6570: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
6580: 2e 20 20 53 65 74 20 74 68 65 20 68 69 64 65 4e  .  Set the hideN
6590: 61 6d 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f  ame flag to acco
65a0: 6d 70 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73  mplish.  ** this
65b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
65c0: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
65d0: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
65e0: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
65f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
6600: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
6610: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
6620: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
6630: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
6640: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
6650: 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
6660: 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
6670: 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
6680: 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
6690: 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e    Table *pTSameN
66a0: 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62  ame;    /* A tab
66b0: 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d  le with same nam
66c0: 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a  e as the index *
66d0: 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  /.    zName = sq
66e0: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
66f0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
6700: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
6710: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
6720: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
6730: 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pISameName = 
6740: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
6750: 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29  db, zName))!=0 )
6760: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 53 61  {.      if( pISa
6770: 6d 65 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e  meName->pTable->
6780: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
6790: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
67a0: 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d        hideName =
67b0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
67c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
67d0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
67e0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65  ->zErrMsg, "inde
67f0: 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20  x ", zName, .   
6800: 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64          " alread
6810: 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20  y exists", 0);. 
6820: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
6830: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
6840: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
6850: 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
6860: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54     }.    if( (pT
6870: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
6880: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
6890: 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Name))!=0 ){.   
68a0: 20 20 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d     if( pTSameNam
68b0: 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61  e->isTemp && pPa
68c0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
68d0: 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d  .        hideNam
68e0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
68f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6900: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
6910: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
6920: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
6930: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c  a table named ",
6940: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  .           zNam
6950: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  e, 0);.        p
6960: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6970: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
6980: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
6990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
69a0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
69b0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
69c0: 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
69d0: 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
69e0: 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
69f0: 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
6a00: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
6a10: 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
6a20: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c  intf(zBuf,"%d)",
6a30: 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
6a40: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
6a50: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
6a60: 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  (", pTab->zName,
6a70: 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20   " autoindex ", 
6a80: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66  zBuf, 0);.    if
6a90: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
6aa0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
6ab0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
6ac0: 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
6ad0: 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
6ae0: 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
6af0: 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
6b00: 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
6b10: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
6b20: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
6b30: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
6b40: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
6b50: 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
6b60: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
6b70: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
6b80: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
6b90: 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
6ba0: 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
6bb0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
6bc0: 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  lId.n = strlen(n
6bd0: 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
6be0: 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69  ist = sqliteIdLi
6bf0: 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c  stAppend(0, &nul
6c00: 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  lId);.    if( pL
6c10: 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
6c20: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
6c30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
6c40: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
6c50: 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
6c60: 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20    */.  pIndex = 
6c70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6c80: 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74  zeof(Index) + st
6c90: 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20  rlen(zName) + 1 
6ca0: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
6cb0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
6cc0: 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64  (int)*pList->nId
6cd0: 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78   );.  if( pIndex
6ce0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
6cf0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
6d00: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
6d10: 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78   = (int*)&pIndex
6d20: 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  [1];.  pIndex->z
6d30: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
6d40: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
6d50: 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73  pList->nId];.  s
6d60: 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  trcpy(pIndex->zN
6d70: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70  ame, zName);.  p
6d80: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
6d90: 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
6da0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
6db0: 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  >nId;.  pIndex->
6dc0: 69 73 55 6e 69 71 75 65 20 3d 20 69 73 55 6e 69  isUnique = isUni
6dd0: 71 75 65 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  que;..  /* Scan 
6de0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
6df0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
6e00: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
6e10: 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
6e20: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
6e30: 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
6e40: 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
6e50: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
6e60: 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
6e70: 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
6e80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
6e90: 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
6ea0: 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  ++){.    for(j=0
6eb0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
6ec0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
6ed0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
6ee0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
6ef0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
6f00: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
6f10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6f20: 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
6f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
6f40: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
6f50: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
6f60: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
6f70: 0a 20 20 20 20 20 20 20 20 22 20 68 61 73 20 6e  .        " has n
6f80: 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22  o column named "
6f90: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
6fa0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ame, 0);.      p
6fb0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6fc0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6fd0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67  pIndex);.      g
6fe0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
6ff0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
7000: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
7010: 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20  n[i] = j;.  }.. 
7020: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
7030: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
7040: 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
7050: 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
7060: 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
7070: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
7080: 73 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  s. .  */.  pInde
7090: 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
70a0: 3e 70 49 6e 64 65 78 3b 0a 20 20 70 54 61 62 2d  >pIndex;.  pTab-
70b0: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
70c0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
70d0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64  >explain && !hid
70e0: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  eName ){.    sql
70f0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
7100: 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64  b->idxHash, pInd
7110: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
7120: 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  n(zName)+1, pInd
7130: 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ex);.    db->fla
7140: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
7150: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
7160: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
7170: 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65  tFlag is 1 it me
7180: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
7190: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
71a0: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
71b0: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
71c0: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
71d0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
71e0: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
71f0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
7200: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72   table number fr
7210: 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  om the pParse->n
7220: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20  ewTnum field..  
7230: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
7240: 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61  >initFlag && pTa
7250: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49  ble!=0 ){.    pI
7260: 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61  ndex->tnum = pPa
7270: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
7280: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69  }..  /* If the i
7290: 6e 69 74 46 6c 61 67 20 69 73 20 30 20 74 68 65  nitFlag is 0 the
72a0: 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
72b0: 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
72c0: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
72d0: 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
72e0: 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
72f0: 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
7300: 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
7310: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
7320: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
7330: 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
7340: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
7350: 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
7360: 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
7370: 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
7380: 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65  ** command.  The
7390: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77   initFlag is 1 w
73a0: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
73b0: 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
73c0: 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
73d0: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
73e0: 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
73f0: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
7400: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
7410: 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
7420: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
7430: 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
7440: 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
7450: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
7460: 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
7470: 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69  * If pTable==0 i
7480: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
7490: 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
74a0: 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
74b0: 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
74c0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
74d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
74e0: 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
74f0: 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
7500: 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
7510: 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
7520: 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
7530: 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
7540: 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
7550: 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
7560: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
7570: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
7580: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
7590: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
75a0: 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c     int lbl1, lbl
75b0: 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  2;.    int i;.  
75c0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
75d0: 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 70 54 61  int isTemp = pTa
75e0: 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20  b->isTemp;..    
75f0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
7600: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
7610: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
7620: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7630: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
7640: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
7650: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
7660: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
7670: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7680: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7690: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30  P_Transaction, 0
76a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
76b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
76c0: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
76d0: 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  , db->schema_coo
76e0: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  kie, 0);.       
76f0: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
7700: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 20  erified = 1;.   
7710: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
7720: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
7730: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7740: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
7750: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
7760: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
7770: 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54  geP3(v, -1, MAST
7780: 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54  ER_NAME, P3_STAT
7790: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
77a0: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65   }.    if( !isTe
77b0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mp ){.      sqli
77c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
77d0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
77e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
77f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7800: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
7810: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
7820: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69  angeP3(v, -1, "i
7830: 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43  ndex", P3_STATIC
7840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7860: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
7870: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
7880: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
7890: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  ndex->zName, P3_
78a0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
78b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
78c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
78d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
78e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
78f0: 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  -1, pTab->zName,
7900: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
7910: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
7920: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7930: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
7940: 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20   0, isTemp);.   
7950: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7960: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
7970: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75  ar*)&pIndex->tnu
7980: 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  m, P3_POINTER);.
7990: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
79a0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
79b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
79c0: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
79d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
79e0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
79f0: 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Aux, 1, 0);.    
7a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7a10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7a20: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
7a30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7a40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7a50: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
7a60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7a70: 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70  .    if( !isTemp
7a80: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   ){.      addr =
7a90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7aa0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7ab0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7ac0: 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
7ad0: 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 28 69  {.        n = (i
7ae0: 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e  nt)pEnd->z - (in
7af0: 74 29 70 53 74 61 72 74 2d 3e 7a 20 2b 20 31 3b  t)pStart->z + 1;
7b00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7b10: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
7b20: 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20  ddr, pStart->z, 
7b30: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
7b40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7b50: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
7b60: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20  rd, 5, 0);.     
7b70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7b80: 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20 30  (v, OP_Put, 0, 0
7b90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7ba0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
7bb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7bc0: 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f 50 5f  (v, isTemp ? OP_
7bd0: 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65  OpenAux : OP_Ope
7be0: 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  n, 2, pTab->tnum
7bf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7c00: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
7c10: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
7c20: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
7c30: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56    lbl1 = sqliteV
7c40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
7c50: 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
7c60: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
7c70: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
7c80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7c90: 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 30 29 3b  P_Rewind, 2, 0);
7ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7cb0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7cc0: 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71   lbl1);.      sq
7cd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7ce0: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
7cf0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
7d00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7d10: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
7d20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7d30: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
7d40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
7d50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7d60: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70   OP_Column, 2, p
7d70: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
7d80: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
7d90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7da0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78  Op(v, OP_MakeIdx
7db0: 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  Key, pIndex->nCo
7dc0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
7dd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7de0: 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 31 2c  v, OP_PutIdx, 1,
7df0: 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75   pIndex->isUniqu
7e00: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
7e10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7e20: 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a  Goto, 0, lbl1);.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7e40: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
7e50: 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl2);.      sql
7e60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7e70: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
7e80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7e90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
7ea0: 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 2, 0);.      
7eb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7ec0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
7ed0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
7ee0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
7ef0: 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70       if( !isTemp
7f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e   ){.        chan
7f10: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
7f20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7f30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
7f40: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 6e 65 78 74 5f  ookie, db->next_
7f50: 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  cookie, 0);.    
7f60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7f70: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
7f80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
7f90: 20 20 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66        if( (db->f
7fa0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
7fb0: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
7fc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
7fe0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
7ff0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
8000: 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
8010: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
8020: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
8030: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
8040: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
8050: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
8060: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8070: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8080: 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
8090: 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
80a0: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
80b0: 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72  iteDropIndex(Par
80c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
80d0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  n *pName){.  Ind
80e0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68  ex *pIndex;.  ch
80f0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62  ar *zName;.  Vdb
8100: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
8110: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8120: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
8130: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
8140: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
8150: 65 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d  eturn;.  zName =
8160: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
8170: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
8180: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8190: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
81a0: 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  dex = sqliteFind
81b0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
81c0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
81d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  Name);.  if( pIn
81e0: 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
81f0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
8200: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8210: 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
8220: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
8230: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
8240: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
8250: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8260: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
8270: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8280: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
8290: 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
82a0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
82b0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
82c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
82d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
82e0: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49  tic VdbeOp dropI
82f0: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
8300: 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c   { OP_OpenWrite,
8310: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 4d 41    0, 2,       MA
8320: 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20  STER_NAME},.    
8330: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
8340: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
8350: 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
8360: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
8370: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20         0}, /* 2 
8380: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  */.      { OP_Ne
8390: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
83a0: 52 28 38 29 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a  R(8), 0}, /* 3 *
83b0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70  /.      { OP_Dup
83c0: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
83d0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
83e0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
83f0: 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 1,       0},.
8400: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
8410: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
8420: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
8430: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
8440: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
8450: 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79      { OP_Destroy
8460: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
8470: 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20   0}, /* 8 */.   
8480: 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69     { OP_SetCooki
8490: 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
84a0: 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20  0}, /* 9 */.    
84b0: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
84c0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
84d0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
84e0: 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c  t base;.    Tabl
84f0: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
8500: 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 69  ->pTable;..    i
8510: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
8520: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
8530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8540: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8550: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30  P_Transaction, 0
8560: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8570: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8580: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
8590: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
85a0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  e, 0);.      pPa
85b0: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
85c0: 69 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ied = 1;.    }. 
85d0: 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73     if( !pTab->is
85e0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61  Temp ){.      ba
85f0: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
8600: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
8610: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
8620: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
8630: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
8640: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32  angeP3(v, base+2
8650: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
8660: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
8670: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
8680: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
8690: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
86a0: 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78   base+9, db->nex
86b0: 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  t_cookie);.    }
86c0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
86d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
86e0: 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  oy, pIndex->tnum
86f0: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
8700: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
8710: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
8720: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
8730: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8740: 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
8750: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
8760: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
8770: 69 6e 74 65 72 6e 61 6c 20 49 6e 64 65 78 20 73  internal Index s
8780: 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 6c  tructure for del
8790: 65 74 69 6f 6e 20 62 79 20 74 68 65 0a 20 20 2a  etion by the.  *
87a0: 2a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e  * sqliteCommitIn
87b0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 20 72 6f  ternalChanges ro
87c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
87d0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
87e0: 69 6e 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  in ){.    pIndex
87f0: 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 31 3b 0a  ->isDelete = 1;.
8800: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
8810: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
8820: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
8830: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
8840: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
8850: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8860: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
8870: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
8880: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
8890: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
88a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
88b0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45 78  prList *sqliteEx
88c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70  prListAppend(Exp
88d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78  rList *pList, Ex
88e0: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
88f0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
8900: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
8910: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
8920: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
8930: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
8940: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
8950: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8960: 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74    }.  if( (pList
8970: 2d 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20  ->nExpr & 7)==0 
8980: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
8990: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b  List->nExpr + 8;
89a0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
89b0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
89c0: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
89d0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
89e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
89f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  ==0 ){.      pLi
8a00: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
8a10: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73       return pLis
8a20: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  t;.    }.  }.  i
8a30: 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
8a40: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  i = pList->nExpr
8a50: 2b 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ++;.    pList->a
8a60: 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [i].pExpr = pExp
8a70: 72 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  r;.    pList->a[
8a80: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  i].zName = 0;.  
8a90: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
8aa0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
8ab0: 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b  tring(&pList->a[
8ac0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  i].zName, pName-
8ad0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
8ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  ;.      sqliteDe
8af0: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
8b00: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
8b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
8b20: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
8b30: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
8b40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8b50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70  /.void sqliteExp
8b60: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
8b70: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
8b80: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
8b90: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
8ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
8bb0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8bc0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
8bd0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
8be0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ].pExpr);.    sq
8bf0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
8c00: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
8c10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
8c20: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
8c30: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
8c40: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
8c50: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
8c60: 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
8c70: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
8c80: 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
8c90: 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
8ca0: 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
8cb0: 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
8cc0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
8cd0: 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
8ce0: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64  eIdListAppend(Id
8cf0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
8d00: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
8d10: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8d20: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
8d30: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
8d40: 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
8d50: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
8d60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
8d70: 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20  ( (pList->nId & 
8d80: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  7)==0 ){.    pLi
8d90: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
8da0: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
8db0: 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73  (pList->nId+8)*s
8dc0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
8dd0: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ]) );.    if( pL
8de0: 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  ist->a==0 ){.   
8df0: 20 20 20 70 4c 69 73 74 2d 3e 6e 49 64 20 3d 20     pList->nId = 
8e00: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  0;.      sqliteI
8e10: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
8e20: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
8e30: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
8e40: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
8e50: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c  [pList->nId], 0,
8e60: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
8e70: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
8e80: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
8e90: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
8ea0: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
8eb0: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
8ec0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f  tNString(pz, pTo
8ed0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
8ee0: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
8ef0: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
8f00: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
8f10: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
8f20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
8f30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8f40: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
8f50: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
8f60: 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
8f70: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
8f80: 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
8f90: 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
8fa0: 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
8fb0: 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
8fc0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
8fd0: 74 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73  teIdListAddAlias
8fe0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
8ff0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
9000: 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
9010: 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20  List->nId>0 ){. 
9020: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
9030: 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73  ->nId - 1;.    s
9040: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
9050: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
9060: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
9070: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
9080: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
9090: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
90a0: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
90b0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
90c0: 69 72 65 20 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f  ire IdList.*/.vo
90d0: 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  id sqliteIdListD
90e0: 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c  elete(IdList *pL
90f0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
9100: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
9110: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
9120: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
9130: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9140: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
9150: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
9160: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
9170: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
9180: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
9190: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
91a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
91b0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
91c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
91d0: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
91e0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
91f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
9200: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73  eteTable(0, pLis
9210: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20  t->a[i].pTab);. 
9220: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9230: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
9240: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
9250: 69 73 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ist);.}.../*.** 
9260: 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64  The COPY command
9270: 20 69 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62   is for compatib
9280: 69 6c 69 74 79 20 77 69 74 68 20 50 6f 73 74 67  ility with Postg
9290: 72 65 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66  reSQL and specif
92a0: 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74  icially.** for t
92b0: 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65  he ability to re
92c0: 61 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ad the output of
92d0: 20 70 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66   pg_dump.  The f
92e0: 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66  ormat is as.** f
92f0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
9300: 20 43 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d   COPY table FROM
9310: 20 66 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c   file [USING DEL
9320: 49 4d 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a  IMITERS string].
9330: 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73  **.** "table" is
9340: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
9350: 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c  le name.  We wil
9360: 6c 20 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20  l read lines of 
9370: 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c  code from.** fil
9380: 65 20 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74  e to fill this t
9390: 61 62 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20  able with data. 
93a0: 20 46 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22   File might be "
93b0: 73 74 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74  stdin".  The opt
93c0: 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74  ional.** delimit
93d0: 65 72 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69  er string identi
93e0: 66 69 65 73 20 74 68 65 20 66 69 65 6c 64 20 73  fies the field s
93f0: 65 70 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20  eparators.  The 
9400: 64 65 66 61 75 6c 74 20 69 73 20 61 20 74 61 62  default is a tab
9410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9420: 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70  Copy(.  Parse *p
9430: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
9440: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
9450: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
9460: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20  TableName,   /* 
9470: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
9480: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
9490: 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20   we will insert 
94a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c  */.  Token *pFil
94b0: 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65  ename,    /* The
94c0: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
94d0: 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72   to obtain infor
94e0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  mation */.  Toke
94f0: 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72 20 20 20  n *pDelimiter   
9500: 20 2f 2a 20 55 73 65 20 74 68 69 73 20 61 73 20   /* Use this as 
9510: 74 68 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69  the field delimi
9520: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ter */.){.  Tabl
9530: 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20  e *pTab;.  char 
9540: 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *zTab;.  int i, 
9550: 6a 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  j;.  Vdbe *v;.  
9560: 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20  int addr, end;. 
9570: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9580: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
9590: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62  rse->db;..  zTab
95a0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
95b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
95c0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  leName);.  if( s
95d0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
95e0: 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  led || zTab==0 )
95f0: 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e   goto copy_clean
9600: 75 70 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  up;.  pTab = sql
9610: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
9620: 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   zTab);.  sqlite
9630: 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66  Free(zTab);.  if
9640: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
9650: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
9660: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
9670: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
9680: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
9690: 20 20 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a     pTableName->z
96a0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c  , pTableName->n,
96b0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
96c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
96d0: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
96e0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
96f0: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
9700: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9710: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
9720: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
9730: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
9740: 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f   " may not be mo
9750: 64 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  dified", 0);.   
9760: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9770: 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63  .    goto copy_c
9780: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20  leanup;.  }.  v 
9790: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
97a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
97b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e   ){.    int open
97c0: 4f 70 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d  Op;.    if( (db-
97d0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
97e0: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
97f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9800: 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
9810: 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20  action, 0, 0);. 
9820: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9830: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
9840: 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68  yCookie, db->sch
9850: 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ema_cookie, 0);.
9860: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63        pParse->sc
9870: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
9880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
9890: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
98a0: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f 70 65  Op(v, OP_FileOpe
98b0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  n, 0, 0);.    sq
98c0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
98d0: 28 76 2c 20 61 64 64 72 2c 20 70 46 69 6c 65 6e  (v, addr, pFilen
98e0: 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d  ame->z, pFilenam
98f0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
9900: 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  eVdbeDequoteP3(v
9910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 6f 70 65  , addr);.    ope
9920: 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  nOp = pTab->isTe
9930: 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75  mp ? OP_OpenWrAu
9940: 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  x : OP_OpenWrite
9950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
9960: 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c  AddOp(v, openOp,
9970: 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   0, pTab->tnum);
9980: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
9990: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
99a0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
99b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f 72 28  TATIC);.    for(
99c0: 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=1, pIdx=pTab->
99d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
99e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
99f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
9a00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
9a10: 70 65 6e 4f 70 2c 20 69 2c 20 70 49 64 78 2d 3e  penOp, i, pIdx->
9a20: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  tnum);.      sql
9a30: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
9a40: 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61  v, -1, pIdx->zNa
9a50: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
9a60: 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20      }.    end = 
9a70: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
9a80: 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72  bel(v);.    addr
9a90: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
9aa0: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61  Op(v, OP_FileRea
9ab0: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65  d, pTab->nCol, e
9ac0: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65  nd);.    if( pDe
9ad0: 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20  limiter ){.     
9ae0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
9af0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65  eP3(v, addr, pDe
9b00: 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c  limiter->z, pDel
9b10: 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20  imiter->n);.    
9b20: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
9b30: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
9b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9b50: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
9b60: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74  eP3(v, addr, "\t
9b70: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 1);.    }.   
9b80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9b90: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
9ba0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
9bb0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pTab->pIndex ){.
9bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9bd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
9be0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
9bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
9c00: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
9c10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9c20: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43  ddOp(v, OP_FileC
9c30: 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20  olumn, i, 0);.  
9c40: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
9c50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
9c60: 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e  keRecord, pTab->
9c70: 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71  nCol, 0);.    sq
9c80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9c90: 20 4f 50 5f 50 75 74 2c 20 30 2c 20 30 29 3b 0a   OP_Put, 0, 0);.
9ca0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
9cb0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
9cc0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9cd0: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
9ce0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4e      if( pIdx->pN
9cf0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ext ){.        s
9d00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9d10: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
9d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9d30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
9d40: 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
9d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9d60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
9d70: 65 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 61  eColumn, pIdx->a
9d80: 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 29 3b 0a  iColumn[j], 0);.
9d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9da0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9db0: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20   OP_MakeIdxKey, 
9dc0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30  pIdx->nColumn, 0
9dd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9de0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
9df0: 75 74 49 64 78 2c 20 69 2c 20 70 49 64 78 2d 3e  utIdx, i, pIdx->
9e00: 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 20 20 7d  isUnique);.    }
9e10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
9e20: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
9e30: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73   0, addr);.    s
9e40: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
9e50: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20  Label(v, end);. 
9e60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9e70: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
9e80: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 64  , 0);.    if( (d
9e90: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9ea0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
9eb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9ec0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
9ed0: 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  mit, 0, 0);.    
9ee0: 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c  }.  }.  .copy_cl
9ef0: 65 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b  eanup:.  return;
9f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f  .}../*.** The no
9f10: 6e 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55 55  n-standard VACUU
9f20: 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  M command is use
9f30: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  d to clean up th
9f40: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63  e database,.** c
9f50: 6f 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70 61  ollapse free spa
9f60: 63 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20  ce, etc.  It is 
9f70: 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74  modelled after t
9f80: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
9f90: 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53  d.** in PostgreS
9fa0: 51 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  QL..*/.void sqli
9fb0: 74 65 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a  teVacuum(Parse *
9fc0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9fd0: 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63 68  TableName){.  ch
9fe0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62  ar *zName;.  Vdb
9ff0: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
a000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a010: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
a020: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
a030: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
a040: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61  eturn;.  if( pTa
a050: 62 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  bleName ){.    z
a060: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
a070: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
a080: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d  pTableName);.  }
a090: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
a0a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
a0b0: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 46 69  Name && sqliteFi
a0c0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
a0d0: 65 29 3d 3d 30 0a 20 20 20 20 26 26 20 73 71 6c  e)==0.    && sql
a0e0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
a0f0: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
a100: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
a110: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
a120: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
a130: 6c 65 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c 20  le or index: ", 
a140: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
a150: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
a160: 20 20 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63     goto vacuum_c
a170: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20  leanup;.  }.  v 
a180: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
a190: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
a1a0: 3d 3d 30 20 29 20 67 6f 74 6f 20 76 61 63 75 75  ==0 ) goto vacuu
a1b0: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28  m_cleanup;.  if(
a1c0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
a1d0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
a1e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
a1f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
a200: 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29  ansaction, 0, 0)
a210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
a220: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
a230: 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63  fyCookie, db->sc
a240: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  hema_cookie, 0);
a250: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68  .    pParse->sch
a260: 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b  emaVerified = 1;
a270: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
a280: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
a290: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
a2a0: 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 29 3b  organize, 0, 0);
a2b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
a2c0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
a2d0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
a2e0: 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  me));.  }else{. 
a2f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
a300: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a310: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
a320: 45 3b 0a 20 20 20 20 66 6f 72 28 70 45 3d 73 71  E;.    for(pE=sq
a330: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
a340: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 3b  b->tblHash); pE;
a350: 20 70 45 3d 73 71 6c 69 74 65 48 61 73 68 4e 65   pE=sqliteHashNe
a360: 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20 70  xt(pE)){.      p
a370: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
a380: 44 61 74 61 28 70 45 29 3b 0a 20 20 20 20 20 20  Data(pE);.      
a390: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a3a0: 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65  v, OP_Reorganize
a3b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
a3c0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
a3d0: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
a3e0: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
a3f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
a400: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
a410: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
a420: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
a430: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a440: 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65  v, OP_Reorganize
a450: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
a460: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
a470: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d  eP3(v, -1, pIdx-
a480: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
a490: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
a4a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 64 62 2d  }.  }.  if( (db-
a4b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
a4c0: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
a4d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a4e0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
a4f0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 76 61 63   0, 0);.  }..vac
a500: 75 75 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  uum_cleanup:.  s
a510: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
a520: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
a530: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
a540: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
a550: 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e   sqliteBeginTran
a560: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
a570: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
a580: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
a590: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
a5a0: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
a5b0: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  >db)==0 || db->p
a5c0: 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Be==0 ) return;.
a5d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
a5e0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
a5f0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
a600: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
a610: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
a620: 54 72 61 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a  Trans ) return;.
a630: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
a640: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
a650: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
a660: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a670: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31  P_Transaction, 1
a680: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a690: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a6a0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62  VerifyCookie, db
a6b0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
a6c0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
a6d0: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
a6e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  = 1;.  }.  db->f
a6f0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
a700: 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nTrans;.}../*.**
a710: 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
a720: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
a730: 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61  liteCommitTransa
a740: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
a750: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
a760: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
a770: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
a780: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
a790: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
a7a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a7b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
a7c0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
a7d0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
a7e0: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
a7f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
a800: 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72  rans)==0 ) retur
a810: 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  n;.  v = sqliteG
a820: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a830: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
a840: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a850: 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20  , OP_Commit, 0, 
a860: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  0);.  }.  db->fl
a870: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
a880: 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nTrans;.}../*.**
a890: 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
a8a0: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
a8b0: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72  sqliteRollbackTr
a8c0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
a8d0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
a8e0: 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
a8f0: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
a900: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
a910: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
a920: 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  >pBe==0 ) return
a930: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
a940: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
a950: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
a960: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
a970: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
a980: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72  _InTrans)==0 ) r
a990: 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c  eturn;.  v = sql
a9a0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
a9b0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
a9c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a9d0: 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63  Op(v, OP_Rollbac
a9e0: 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  k, 0, 0);.  }.  
a9f0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
aa00: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a  LITE_InTrans;.}.
aa10: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
aa20: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
aa30: 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g as a boolean v
aa40: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
aa50: 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63  int getBoolean(c
aa60: 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69  har *z){.  stati
aa70: 63 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d  c char *azTrue[]
aa80: 20 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22   = { "yes", "on"
aa90: 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e  , "true" };.  in
aaa0: 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d  t i;.  if( z[0]=
aab0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
aac0: 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30   if( isdigit(z[0
aad0: 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27  ]) || (z[0]=='-'
aae0: 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d   && isdigit(z[1]
aaf0: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
ab00: 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20   atoi(z);.  }.  
ab10: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
ab20: 66 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66  f(azTrue)/sizeof
ab30: 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b  (azTrue[0]); i++
ab40: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
ab50: 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75  eStrICmp(z,azTru
ab60: 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  e[i])==0 ) retur
ab70: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
ab80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
ab90: 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73  ocess a pragma s
aba0: 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  tatement.  .**.*
abb0: 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66  * Pragmas are of
abc0: 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a   this form:.**.*
abd0: 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64  *      PRAGMA id
abe0: 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54   = value.**.** T
abf0: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69  he identifier mi
ac00: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74  ght also be a st
ac10: 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65  ring.  The value
ac20: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e   is a string, an
ac30: 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c  d.** identifier,
ac40: 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49   or a number.  I
ac50: 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74  f minusFlag is t
ac60: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61  rue, then the va
ac70: 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62  lue is.** a numb
ac80: 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63  er that was prec
ac90: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
aca0: 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sign..*/.void sq
acb0: 6c 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65  litePragma(Parse
acc0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
acd0: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
ace0: 52 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73  Right, int minus
acf0: 46 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Flag){.  char *z
ad00: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Left = 0;.  char
ad10: 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *zRight = 0;.  
ad20: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
ad30: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66  rse->db;..  zLef
ad40: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
ad50: 70 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66  p(pLeft->z, pLef
ad60: 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  t->n);.  sqliteD
ad70: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
ad80: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
ad90: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30  {.    zRight = 0
ada0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
adb0: 53 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20  String(&zRight, 
adc0: 22 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e  "-", 1, pRight->
add0: 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29  z, pRight->n, 0)
ade0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
adf0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74  Right = sqliteSt
ae00: 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c  rNDup(pRight->z,
ae10: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20   pRight->n);.   
ae20: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
ae30: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20  Right);.  }. .  
ae40: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ae50: 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73  p(zLeft,"cache_s
ae60: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
ae70: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
ae80: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  zRight);.    sql
ae90: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
aea0: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 73 69  Size(db->pBe, si
aeb0: 7a 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ze);.  }else..  
aec0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
aed0: 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74  p(zLeft, "vdbe_t
aee0: 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
aef0: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
af00: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
af10: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
af20: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a  LITE_VdbeTrace;.
af30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af40: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
af50: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
af60: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
af70: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
af80: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c  Cmp(zLeft, "full
af90: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d  _column_names")=
afa0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
afb0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
afc0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
afd0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75  ags |= SQLITE_Fu
afe0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  llColNames;.    
aff0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
b000: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
b010: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
b020: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
b030: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
b040: 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74  mp(zLeft, "count
b050: 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b  _changes")==0 ){
b060: 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
b070: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
b080: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
b090: 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  = SQLITE_CountRo
b0a0: 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
b0b0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
b0c0: 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  = ~SQLITE_CountR
b0d0: 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ows;.    }.  }el
b0e0: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
b0f0: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
b100: 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20  table_info")==0 
b110: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
b120: 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
b130: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
b140: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
b150: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
b160: 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69   pTab ) v = sqli
b170: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
b180: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
b190: 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
b1a0: 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
b1b0: 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
b1c0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
b1d0: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20  ColumnCount, 5, 
b1e0: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
b1f0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b200: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
b210: 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
b220: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
b230: 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
b240: 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
b250: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
b260: 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
b270: 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20  "type"},.       
b280: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
b290: 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  3, 0,       "
b2a0: 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20  notnull"},.     
b2b0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
b2c0: 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20  me,  4, 0,      
b2d0: 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a   "dflt_value"},.
b2e0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
b2f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
b300: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
b310: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62  v, ArraySize(tab
b320: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20  leInfoPreface), 
b330: 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
b340: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
b350: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
b360: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
b370: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b380: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
b390: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
b3a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b3b0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
b3c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b3d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
b3e0: 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  1, pTab->aCol[i]
b3f0: 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  .zName, P3_STATI
b400: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
b410: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b420: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
b430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b440: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
b450: 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  1, .           p
b460: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  Tab->aCol[i].zTy
b470: 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe ? pTab->aCol[
b480: 69 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74  i].zType : "text
b490: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
b4a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b4b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b4c0: 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  eger, pTab->aCol
b4d0: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b  [i].notNull, 0);
b4e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b4f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
b500: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
b510: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b520: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b530: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  pTab->aCol[i].zD
b540: 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  flt, P3_STATIC);
b550: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b560: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b570: 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a  allback, 5, 0);.
b580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b590: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
b5a0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
b5b0: 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d  , "index_info")=
b5c0: 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
b5d0: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
b5e0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65   *pTab;.    Vdbe
b5f0: 20 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20   *v;.    pIdx = 
b600: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
b610: 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  db, zRight);.   
b620: 20 69 66 28 20 70 49 64 78 20 29 20 76 20 3d 20   if( pIdx ) v = 
b630: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
b640: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  arse);.    if( p
b650: 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20  Idx && v ){.    
b660: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
b670: 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
b680: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
b690: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
b6a0: 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   3, 0,       0},
b6b0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
b6c0: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
b6d0: 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c         "seqno"},
b6e0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
b6f0: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
b700: 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20         "cid"},. 
b710: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
b720: 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20  mnName,  2, 0,  
b730: 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20       "name"},.  
b740: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74      };.      int
b750: 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   i;.      pTab =
b760: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
b770: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b780: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
b790: 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50  ySize(tableInfoP
b7a0: 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e  reface), tableIn
b7b0: 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20  foPreface);.    
b7c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
b7d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
b7e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e  {.        int cn
b7f0: 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  um = pIdx->aiCol
b800: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
b810: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b820: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
b830: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
b840: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b850: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75   OP_Integer, cnu
b860: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
b870: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b880: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
b890: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
b8a0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b8b0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
b8c0: 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33  [cnum].zName, P3
b8d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
b8e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b8f0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
b900: 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 3, 0);.      }
b910: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
b920: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
b930: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
b940: 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20  x_list")==0 ){. 
b950: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
b960: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
b970: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
b980: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
b990: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
b9a0: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ght);.    if( pT
b9b0: 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ab ){.      v = 
b9c0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
b9d0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64  arse);.      pId
b9e0: 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  x = pTab->pIndex
b9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ba00: 70 54 61 62 20 26 26 20 70 49 64 78 20 26 26 20  pTab && pIdx && 
ba10: 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  v ){.      int i
ba20: 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74 61   = 0; .      sta
ba30: 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78  tic VdbeOp index
ba40: 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20  ListPreface[] = 
ba50: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  {.        { OP_C
ba60: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30  olumnCount, 3, 0
ba70: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
ba80: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
ba90: 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
baa0: 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20    "seq"},.      
bab0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
bac0: 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
bad0: 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20  "name"},.       
bae0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
baf0: 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  2, 0,       "
bb00: 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20  unique"},.      
bb10: 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  };..      sqlite
bb20: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
bb30: 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78   ArraySize(index
bb40: 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e  ListPreface), in
bb50: 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b  dexListPreface);
bb60: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64  .      while(pId
bb70: 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  x){.        sqli
bb80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bb90: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
bba0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bbb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bbc0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
bbd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
bbe0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
bbf0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pIdx->zName, P3
bc00: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
bc10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bc20: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
bc30: 20 70 49 64 78 2d 3e 69 73 55 6e 69 71 75 65 2c   pIdx->isUnique,
bc40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
bc50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bc60: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20  OP_Callback, 3, 
bc70: 30 29 3b 0a 09 2b 2b 69 3b 0a 09 70 49 64 78 20  0);..++i;..pIdx 
bc80: 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pIdx->pNext;. 
bc90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bca0: 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44  else..#ifndef ND
bcb0: 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
bcc0: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
bcd0: 22 70 61 72 73 65 72 5f 74 72 61 63 65 22 29 3d  "parser_trace")=
bce0: 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
bcf0: 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61 72 73   void sqlitePars
bd00: 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20 63  erTrace(FILE*, c
bd10: 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66 28 20  har *);.    if( 
bd20: 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
bd30: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
bd40: 74 65 50 61 72 73 65 72 54 72 61 63 65 28 73 74  teParserTrace(st
bd50: 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22  dout, "parser: "
bd60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bd70: 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72      sqliteParser
bd80: 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20  Trace(0, 0);.   
bd90: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
bda0: 66 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65  f..  {}.  sqlite
bdb0: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73  Free(zLeft);.  s
bdc0: 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74  qliteFree(zRight
bdd0: 29 3b 0a 7d 0a                                   );.}.