/ Hex Artifact Content
Login

Artifact b459cbe33ee617f46b1975f96ae605d3519583d9:


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 34 20 32 30 30  ild.c,v 1.54 200
0320: 31 2f 31 31 2f 30 37 20 31 34 3a 32 32 3a 30 30  1/11/07 14:22:00
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0820: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0830: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0840: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0850: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
0860: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
0870: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0880: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0890: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
08a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
08b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
08c0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
08d0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
08e0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
08f0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0900: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0910: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0920: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0930: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0940: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0950: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0960: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0970: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0980: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  eExprDelete(pLef
0990: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  t);.    sqliteEx
09a0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
09b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
09c0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
09d0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
09e0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
09f0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
0a00: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
0a10: 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  n ){.    pNew->t
0a20: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
0a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0a40: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b  w->token.z = "";
0a50: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0a60: 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .n = 0;.  }.  if
0a70: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
0a80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  t ){.    sqliteE
0a90: 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70  xprSpan(pNew, &p
0aa0: 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69  Left->span, &pRi
0ab0: 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65  ght->span);.  }e
0ac0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  lse{.    pNew->s
0ad0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
0ae0: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
0af0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pNew;.}../*.** S
0b00: 65 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  et the Expr.toke
0b10: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
0b20: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
0b30: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
0b40: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
0b50: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
0b60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0b70: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
0b80: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
0b90: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
0ba0: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  t){.  if( pExpr 
0bb0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
0bc0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
0bd0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e  .    pExpr->span
0be0: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
0bf0: 20 28 69 6e 74 29 70 52 69 67 68 74 2d 3e 7a 20   (int)pRight->z 
0c00: 2d 20 28 69 6e 74 29 70 4c 65 66 74 2d 3e 7a 3b  - (int)pLeft->z;
0c10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0c20: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
0c30: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
0c40: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
0c50: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
0c60: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
0c70: 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63   *sqliteExprFunc
0c80: 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70  tion(ExprList *p
0c90: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
0ca0: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
0cb0: 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  ew;.  pNew = sql
0cc0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
0cd0: 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28  f(Expr) );.  if(
0ce0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
0cf0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
0d00: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
0d10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
0d20: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
0d30: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
0d40: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
0d50: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
0d60: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20      pNew->token 
0d70: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c  = *pToken;.  }el
0d80: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  se{.    pNew->to
0d90: 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20  ken.z = "";.    
0da0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  pNew->token.n = 
0db0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0dc0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
0dd0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
0de0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
0df0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
0e00: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 45  liteExprDelete(E
0e10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
0e20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0e30: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73  if( p->pLeft ) s
0e40: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0e50: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
0e60: 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c   p->pRight ) sql
0e70: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
0e80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20  >pRight);.  if( 
0e90: 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c 69 74  p->pList ) sqlit
0ea0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
0eb0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69 66 28  p->pList);.  if(
0ec0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71   p->pSelect ) sq
0ed0: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
0ee0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
0ef0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0f00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0f10: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0f20: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0f30: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0f40: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
0f50: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
0f60: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20  name.** of that 
0f70: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
0f80: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
0f90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
0fa0: 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  teFindTable(sqli
0fb0: 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e  te *db, char *zN
0fc0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
0fd0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e   = sqliteHashFin
0fe0: 64 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20  d(&db->tblHash, 
0ff0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1000: 61 6d 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72  ame)+1);.  retur
1010: 6e 20 28 70 3d 3d 30 20 7c 7c 20 70 2d 3e 69 73  n (p==0 || p->is
1020: 44 65 6c 65 74 65 29 20 3f 20 30 20 3a 20 70 3b  Delete) ? 0 : p;
1030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1040: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1050: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1060: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
1070: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
1080: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1090: 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20   that index..** 
10a0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
10b0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64  ot found..*/.Ind
10c0: 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e  ex *sqliteFindIn
10d0: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
10e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
10f0: 49 6e 64 65 78 20 2a 70 20 3d 20 73 71 6c 69 74  Index *p = sqlit
1100: 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 69  eHashFind(&db->i
1110: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1120: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
1130: 0a 20 20 72 65 74 75 72 6e 20 28 70 3d 3d 30 20  .  return (p==0 
1140: 7c 7c 20 70 2d 3e 69 73 44 65 6c 65 74 65 29 20  || p->isDelete) 
1150: 3f 20 30 20 3a 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  ? 0 : p;.}../*.*
1160: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
1170: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
1180: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
1190: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
11a0: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
11b0: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
11c0: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
11d0: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
11e0: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  ase hash table i
11f0: 66 20 64 62 21 3d 4e 55 4c 4c 2e 0a 2a 2a 20 42  f db!=NULL..** B
1200: 75 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ut the index is 
1210: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
1220: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
1230: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
1240: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
1250: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
1260: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1270: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
1280: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1290: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
12a0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
12b0: 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66  x *pIndex){.  if
12c0: 28 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20  ( pIndex->zName 
12d0: 26 26 20 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  && db ){.    sql
12e0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
12f0: 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64  b->idxHash, pInd
1300: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
1310: 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  n(pIndex->zName)
1320: 2b 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  +1, 0);.  }.  sq
1330: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
1340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
1350: 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  k the given inde
1360: 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65  x from its table
1370: 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a  , then remove.**
1380: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20   the index from 
1390: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
13a0: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74  able and free it
13b0: 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75  s memory.** stru
13c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
13d0: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
13e0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
13f0: 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  e *db, Index *pI
1400: 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e  ndex){.  if( pIn
1410: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
1420: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
1430: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
1440: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
1450: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ex->pNext;.  }el
1460: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
1470: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64  ;.    for(p=pInd
1480: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1490: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
14a0: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
14b0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  pNext){}.    if(
14c0: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
14d0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
14e0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
14f0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
1500: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65    }.  sqliteDele
1510: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
1520: 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ex);.}../*.** Re
1530: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
1540: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
1550: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1560: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
1570: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
1580: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
1590: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
15a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15b0: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
15c0: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
15d0: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
15e0: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
15f0: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
1600: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
1610: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
1620: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
1630: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
1640: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
1650: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
1660: 69 74 68 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ith the table..*
1670: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
1680: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1690: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
16a0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
16b0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
16c0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
16d0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
16e0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
16f0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
1700: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
1710: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1720: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
1730: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
1740: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1750: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1760: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1770: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
1780: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
1790: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  x, *pNext;.  if(
17a0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
17b0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
17c0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
17d0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
17e0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
17f0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
1800: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1810: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
1820: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
1830: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
1840: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  i].zType);.  }. 
1850: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
1860: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
1870: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
1880: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
1890: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
18a0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
18b0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
18c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
18d0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  ree(pTable->zNam
18e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
18f0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
1900: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1910: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
1920: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
1930: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
1940: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
1950: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
1960: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1970: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64   and all its ind
1980: 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ices..*/.static 
1990: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
19a0: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
19b0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
19c0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 66  e *pTable){.  if
19d0: 28 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20  ( pTable->zName 
19e0: 26 26 20 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  && db ){.    sql
19f0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
1a00: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 54 61 62  b->tblHash, pTab
1a10: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  le->zName, strle
1a20: 6e 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  n(pTable->zName)
1a30: 2b 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  +1, 0);.  }.  sq
1a40: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
1a50: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
1a60: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c 20  /*.** Check all 
1a70: 54 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65 78  Tables and Index
1a80: 65 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e  es in the intern
1a90: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  al hash table an
1aa0: 64 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79 20  d commit.** any 
1ab0: 61 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c  additions or del
1ac0: 65 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65 20  etions to those 
1ad0: 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  hash tables..**.
1ae0: 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e  ** When executin
1af0: 67 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61  g CREATE TABLE a
1b00: 6e 64 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nd CREATE INDEX 
1b10: 73 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 20  statements, the 
1b20: 54 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e 64  Table.** and Ind
1b30: 65 78 20 73 74 72 75 63 74 75 72 65 73 20 61 72  ex structures ar
1b40: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  e created and ad
1b50: 64 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 20  ded to the hash 
1b60: 74 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20 74  tables, but.** t
1b70: 68 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66 69  he "isCommit" fi
1b80: 65 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e 20  eld is not set. 
1b90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1ba0: 74 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ts those fields.
1bb0: 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69  .** When executi
1bc0: 6e 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e  ng DROP TABLE an
1bd0: 64 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74 68  d DROP INDEX, th
1be0: 65 20 22 69 73 44 65 6c 65 74 65 22 20 66 69 65  e "isDelete" fie
1bf0: 6c 64 73 20 6f 66 0a 2a 2a 20 54 61 62 6c 65 20  lds of.** Table 
1c00: 61 6e 64 20 49 6e 64 65 78 20 73 74 72 75 63 74  and Index struct
1c10: 75 72 65 73 20 69 73 20 73 65 74 20 62 75 74 20  ures is set but 
1c20: 74 68 65 20 73 74 72 75 63 74 75 72 65 73 20 61  the structures a
1c30: 72 65 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 0a  re not unlinked.
1c40: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  ** from the hash
1c50: 20 74 61 62 6c 65 73 20 6e 6f 72 20 64 65 61 6c   tables nor deal
1c60: 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 72  located.  This r
1c70: 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 74  outine handles t
1c80: 68 61 74 0a 2a 2a 20 64 65 61 6c 6c 6f 63 61 74  hat.** deallocat
1c90: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ion. .**.** See 
1ca0: 61 6c 73 6f 3a 20 73 71 6c 69 74 65 52 6f 6c 6c  also: sqliteRoll
1cb0: 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e  backInternalChan
1cc0: 67 65 73 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71  ges().*/.void sq
1cd0: 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  liteCommitIntern
1ce0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
1cf0: 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f   *db){.  Hash to
1d00: 44 65 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c  Delete;.  HashEl
1d10: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28  em *pElem;.  if(
1d20: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1d30: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
1d40: 65 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  es)==0 ) return;
1d50: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69  .  sqliteHashIni
1d60: 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c  t(&toDelete, SQL
1d70: 49 54 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52  ITE_HASH_POINTER
1d80: 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 73 63 68 65  , 0);.  db->sche
1d90: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1da0: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66  next_cookie;.  f
1db0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1dc0: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62  ashFirst(&db->tb
1dd0: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
1de0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1df0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1e00: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d   Table *pTable =
1e10: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1e20: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
1e30: 70 54 61 62 6c 65 2d 3e 69 73 44 65 6c 65 74 65  pTable->isDelete
1e40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e50: 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65  HashInsert(&toDe
1e60: 6c 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c  lete, pTable, 0,
1e70: 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65   pTable);.    }e
1e80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
1e90: 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b  e->isCommit = 1;
1ea0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
1eb0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
1ec0: 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65  hFirst(&toDelete
1ed0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
1ee0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
1ef0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
1f00: 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  e *pTable = sqli
1f10: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
1f20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  );.    sqliteUnl
1f30: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
1f40: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  e(db, pTable);. 
1f50: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
1f60: 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b  lear(&toDelete);
1f70: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
1f80: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
1f90: 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45 6c 65  ->idxHash); pEle
1fa0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
1fb0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
1fc0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 49 6e 64  .    Table *pInd
1fd0: 65 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ex = sqliteHashD
1fe0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
1ff0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 73 44 65  if( pIndex->isDe
2000: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  lete ){.      sq
2010: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
2020: 74 6f 44 65 6c 65 74 65 2c 20 70 49 6e 64 65 78  toDelete, pIndex
2030: 2c 20 30 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  , 0, pIndex);.  
2040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2050: 49 6e 64 65 78 2d 3e 69 73 43 6f 6d 6d 69 74 20  Index->isCommit 
2060: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
2070: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2080: 65 48 61 73 68 46 69 72 73 74 28 26 74 6f 44 65  eHashFirst(&toDe
2090: 6c 65 74 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45  lete); pElem; pE
20a0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
20b0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
20c0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
20d0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
20e0: 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Elem);.    sqlit
20f0: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
2100: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
2110: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48  );.  }.  sqliteH
2120: 61 73 68 43 6c 65 61 72 28 26 74 6f 44 65 6c 65  ashClear(&toDele
2130: 74 65 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  te);.  db->flags
2140: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
2150: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
2160: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2170: 20 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f   runs when one o
2180: 72 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41  r more CREATE TA
2190: 42 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45  BLE, CREATE INDE
21a0: 58 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45  X,.** DROP TABLE
21b0: 2c 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20  , or DROP INDEX 
21c0: 73 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20  statements gets 
21d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68  rolled back.  Th
21e0: 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f  e.** additions o
21f0: 72 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54  r deletions of T
2200: 61 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73  able and Index s
2210: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
2220: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
2230: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64  h tables are und
2240: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  one..**.** See a
2250: 6c 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69  lso: sqliteCommi
2260: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
2270: 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ().*/.void sqlit
2280: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
2290: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
22a0: 2a 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44  *db){.  Hash toD
22b0: 65 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65  elete;.  HashEle
22c0: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20  m *pElem;.  if( 
22d0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
22e0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
22f0: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
2300: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
2310: 28 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49  (&toDelete, SQLI
2320: 54 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c  TE_HASH_POINTER,
2330: 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f   0);.  db->next_
2340: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
2350: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f  ema_cookie;.  fo
2360: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2370: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
2380: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
2390: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
23a0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
23b0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20  Table *pTable = 
23c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
23d0: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21  Elem);.    if( !
23e0: 70 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74  pTable->isCommit
23f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2400: 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65  HashInsert(&toDe
2410: 6c 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c  lete, pTable, 0,
2420: 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65   pTable);.    }e
2430: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
2440: 65 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 30 3b  e->isDelete = 0;
2450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
2460: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2470: 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65  hFirst(&toDelete
2480: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2490: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
24a0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
24b0: 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  e *pTable = sqli
24c0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
24d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  );.    sqliteUnl
24e0: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
24f0: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  e(db, pTable);. 
2500: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2510: 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b  lear(&toDelete);
2520: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
2530: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
2540: 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45 6c 65  ->idxHash); pEle
2550: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2560: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2570: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 49 6e 64  .    Table *pInd
2580: 65 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ex = sqliteHashD
2590: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
25a0: 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 69 73 43  if( !pIndex->isC
25b0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  ommit ){.      s
25c0: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
25d0: 26 74 6f 44 65 6c 65 74 65 2c 20 70 49 6e 64 65  &toDelete, pInde
25e0: 78 2c 20 30 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x, 0, pIndex);. 
25f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2600: 70 49 6e 64 65 78 2d 3e 69 73 44 65 6c 65 74 65  pIndex->isDelete
2610: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2620: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
2630: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 6f 44  teHashFirst(&toD
2640: 65 6c 65 74 65 29 3b 20 70 45 6c 65 6d 3b 20 70  elete); pElem; p
2650: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
2660: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
2670: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
2680: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
2690: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  pElem);.    sqli
26a0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
26b0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
26c0: 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
26d0: 48 61 73 68 43 6c 65 61 72 28 26 74 6f 44 65 6c  HashClear(&toDel
26e0: 65 74 65 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ete);.  db->flag
26f0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
2700: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2710: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
2720: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65  he name of a use
2730: 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  r table or index
2740: 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a   from a token..*
2750: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
2760: 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f  ld the name is o
2770: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2780: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
2790: 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64  must.** be freed
27a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
27b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
27c0: 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61  r *sqliteTableNa
27d0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65  meFromToken(Toke
27e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
27f0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
2800: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
2810: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
2820: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e  sqliteDequote(zN
2830: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ame);.  return z
2840: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  Name;.}../*.** B
2850: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
2860: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
2870: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
2880: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
2890: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
28a0: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
28b0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
28c0: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
28d0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
28e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
28f0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
2900: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
2910: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
2920: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
2930: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
2940: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
2950: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
2960: 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e  .** pStart token
2970: 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61   is the CREATE a
2980: 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  nd pName is the 
2990: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
29a0: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
29b0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 22  is true if the "
29c0: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
29d0: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
29e0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
29f0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
2a00: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
2a10: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
2a20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
2a30: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
2a40: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
2a50: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
2a60: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
2a70: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
2a80: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
2a90: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
2aa0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
2ab0: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
2ac0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
2ad0: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
2ae0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
2af0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2b00: 2c 20 74 68 65 20 73 71 6c 69 74 65 45 6e 64 54  , the sqliteEndT
2b10: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
2b20: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
2b30: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
2b40: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
2b50: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
2b60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2b70: 53 74 61 72 74 54 61 62 6c 65 28 50 61 72 73 65  StartTable(Parse
2b80: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
2b90: 2a 70 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a  *pStart, Token *
2ba0: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 54 65 6d  pName, int isTem
2bb0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  p){.  Table *pTa
2bc0: 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ble;.  Index *pI
2bd0: 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  dx;.  char *zNam
2be0: 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  e;.  sqlite *db 
2bf0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2c00: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 70 50 61 72  Vdbe *v;..  pPar
2c10: 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20  se->sFirstToken 
2c20: 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61  = *pStart;.  zNa
2c30: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
2c40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
2c50: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
2c60: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
2c70: 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69    /* Before tryi
2c80: 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ng to create a t
2c90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2ca0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  make sure the Bt
2cb0: 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c  ree for.  ** hol
2cc0: 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ding temporary t
2cd0: 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20  ables is open.. 
2ce0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
2cf0: 20 26 26 20 64 62 2d 3e 70 42 65 54 65 6d 70 3d   && db->pBeTemp=
2d00: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
2d10: 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70   = sqliteBtreeOp
2d20: 65 6e 28 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  en(0, 0, MAX_PAG
2d30: 45 53 2c 20 26 64 62 2d 3e 70 42 65 54 65 6d 70  ES, &db->pBeTemp
2d40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d60: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
2d70: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
2d80: 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  Msg, "unable to 
2d90: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
2da0: 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
2db0: 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
2dc0: 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
2dd0: 74 61 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20  tables", 0);.   
2de0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2df0: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
2e00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
2e10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2e20: 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  E_InTrans ){.   
2e30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74     rc = sqliteBt
2e40: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
2e50: 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
2e60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
2e80: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2e90: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
2ea0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
2eb0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
2ec0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
2ed0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 62  e temporary datb
2ee0: 61 73 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20  ase file", 0);. 
2ef0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
2f00: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72  Err++;.        r
2f10: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
2f20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2f30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
2f40: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
2f50: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
2f60: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
2f70: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
2f80: 65 20 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61  e name.  Issue a
2f90: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2fa0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a  if it does..  **
2fb0: 0a 20 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20  .  ** If we are 
2fc0: 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73  re-reading the s
2fd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2fe0: 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  le because of a 
2ff0: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e  schema.  ** chan
3000: 67 65 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72  ge and a new per
3010: 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20  manent table is 
3020: 66 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65  found whose name
3030: 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20   collides with. 
3040: 20 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20   ** an existing 
3050: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
3060: 20 74 68 65 6e 20 69 67 6e 6f 72 65 20 74 68 65   then ignore the
3070: 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74   new permanent t
3080: 61 62 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69  able..  ** We wi
3090: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73  ll continue pars
30a0: 69 6e 67 2c 20 62 75 74 20 74 68 65 20 70 50 61  ing, but the pPa
30b0: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66  rse->nameClash f
30c0: 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 0a  lag will be set.
30d0: 20 20 2a 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20    ** so we will 
30e0: 6b 6e 6f 77 20 74 6f 20 64 69 73 63 61 72 64 20  know to discard 
30f0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
3100: 20 6f 6e 63 65 20 70 61 72 73 69 6e 67 20 68 61   once parsing ha
3110: 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f  s finished..  */
3120: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
3130: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
3140: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
3150: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  able!=0 ){.    i
3160: 66 28 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  f( pTable->isTem
3170: 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69  p && pParse->ini
3180: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70  tFlag ){.      p
3190: 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68  Parse->nameClash
31a0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
31b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
31c0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
31d0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
31e0: 20 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c   ", 0, pName->z,
31f0: 20 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20   pName->n,.     
3200: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
3210: 78 69 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20  xists", 0, 0);. 
3220: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3230: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50  zName);.      pP
3240: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3250: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3260: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
3270: 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68  Parse->nameClash
3280: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
3290: 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69  (pIdx = sqliteFi
32a0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
32b0: 65 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  e))!=0 &&.      
32c0: 20 20 20 20 28 21 70 49 64 78 2d 3e 70 54 61 62      (!pIdx->pTab
32d0: 6c 65 2d 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70  le->isTemp || !p
32e0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29  Parse->initFlag)
32f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
3300: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
3310: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65  >zErrMsg, "there
3320: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
3330: 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20  ndex named ", . 
3340: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b        zName, 0);
3350: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3360: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72  zName);.    pPar
3370: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3380: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
3390: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  able = sqliteMal
33a0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
33b0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
33c0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
33d0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
33e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
33f0: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
3400: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
3410: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->nCol = 0;.  p
3420: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
3430: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
3440: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
3450: 3e 69 73 54 65 6d 70 20 3d 20 69 73 54 65 6d 70  >isTemp = isTemp
3460: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3470: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
3480: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
3490: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
34a0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
34b0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
34c0: 6c 65 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  le;.  if( !pPars
34d0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28  e->initFlag && (
34e0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
34f0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
3500: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
3510: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
3520: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
3530: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3540: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
3550: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ion, 0, 0);.    
3560: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3570: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
3580: 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61  okie, db->schema
3590: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
35a0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
35b0: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
35c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
35d0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
35e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
35f0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
3600: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
3610: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3620: 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  , -1, MASTER_NAM
3630: 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  E, P3_STATIC);. 
3640: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3650: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
3660: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
3670: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3680: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
3690: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
36a0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
36b0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
36c0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
36d0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
36e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
36f0: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3700: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3710: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3720: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3730: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
3740: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
3750: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
3760: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
3770: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
3780: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3790: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
37a0: 70 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  p;.  char **pz;.
37b0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
37c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
37d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
37e0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
37f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
3800: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
3810: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
3820: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
3830: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
3840: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
3850: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
3860: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
3870: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
3880: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 6f 6c   memset(&p->aCol
3890: 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69  [p->nCol], 0, si
38a0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
38b0: 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  );.  pz = &p->aC
38c0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e  ol[p->nCol++].zN
38d0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  ame;.  sqliteSet
38e0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e 61 6d  NString(pz, pNam
38f0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3900: 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  0);.  sqliteDequ
3910: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
3920: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3930: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
3940: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
3950: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
3960: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
3970: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3980: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
3990: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
39a0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
39b0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
39c0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
39d0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
39e0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
39f0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
3a00: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
3a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e  .void sqliteAddN
3a20: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
3a30: 61 72 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  arse){.  Table *
3a40: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
3a50: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
3a60: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
3a70: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
3a80: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
3a90: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
3aa0: 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 7d 0a 0a  notNull = 1;.}..
3ab0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3ac0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
3ad0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
3ae0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
3af0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
3b00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3b10: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
3b20: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
3b30: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
3b40: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
3b50: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
3b60: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
3b70: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
3b80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
3b90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
3ba0: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
3bb0: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
3bc0: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
3bd0: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
3be0: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
3bf0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
3c00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
3c10: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
3c20: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
3c30: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
3c40: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
3c50: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e   sqliteAddColumn
3c60: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
3c70: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
3c80: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
3c90: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
3ca0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
3cb0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a  n;.  char *z, **
3cc0: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
3cd0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3ce0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
3cf0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
3d00: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
3d10: 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61  rn;.  pz = &p->a
3d20: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b 0a 20 20  Col[i].zType;.  
3d30: 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 28  n = pLast->n + (
3d40: 28 69 6e 74 29 70 4c 61 73 74 2d 3e 7a 29 20 2d  (int)pLast->z) -
3d50: 20 28 69 6e 74 29 70 46 69 72 73 74 2d 3e 7a 3b   (int)pFirst->z;
3d60: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
3d70: 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e  ing(pz, pFirst->
3d80: 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20  z, n, 0);.  z = 
3d90: 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  *pz;.  if( z==0 
3da0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
3db0: 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  i=j=0; z[i]; i++
3dc0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  ){.    int c = z
3dd0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73  [i];.    if( iss
3de0: 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e  pace(c) ) contin
3df0: 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  ue;.    z[j++] =
3e00: 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   c;.  }.  z[j] =
3e10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
3e20: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20   given token is 
3e30: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
3e40: 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63  e for the last c
3e50: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a  olumn added to.*
3e60: 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  * the table curr
3e70: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3e80: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d  truction.  If "m
3e90: 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75  inusFlag" is tru
3ea0: 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  e, it.** means t
3eb0: 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77  he value token w
3ec0: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
3ed0: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a   minus sign..**.
3ee0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ef0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
3f00: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
3f10: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
3f20: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
3f30: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3f40: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
3f50: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
3f60: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
3f70: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e   Token *pVal, in
3f80: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
3f90: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
3fa0: 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  i;.  char **pz;.
3fb0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3fc0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3fd0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
3fe0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
3ff0: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
4000: 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b    pz = &p->aCol[
4010: 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20  i].zDflt;.  if( 
4020: 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
4030: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4040: 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56  g(pz, "-", 1, pV
4050: 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20  al->z, pVal->n, 
4060: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
4070: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4080: 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  g(pz, pVal->z, p
4090: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a  Val->n, 0);.  }.
40a0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
40b0: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  *pz);.}../*.** C
40c0: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65  ome up with a ne
40d0: 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66  w random value f
40e0: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  or the schema co
40f0: 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  okie.  Make sure
4100: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75  .** the new valu
4110: 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  e is different f
4120: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a  rom the old..**.
4130: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
4140: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
4150: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
4160: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
4170: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
4180: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
4190: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
41a0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
41b0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
41c0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
41d0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
41e0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
41f0: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
4200: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
4210: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
4220: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
4230: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
4240: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
4250: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
4260: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
4270: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
4280: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
4290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
42a0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
42b0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
42c0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
42d0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
42e0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
42f0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
4300: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
4310: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
4320: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
4330: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
4340: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
4350: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
4360: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
4370: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
4380: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
4390: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
43a0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
43b0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
43c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
43d0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
43e0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
43f0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d  b->next_cookie==
4400: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
4410: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78  e ){.    db->nex
4420: 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73  t_cookie = db->s
4430: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 73  chema_cookie + s
4440: 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28  qliteRandomByte(
4450: 64 62 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d  db) + 1;.    db-
4460: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4470: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4480: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
4490: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
44a0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
44b0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
44c0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
44d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
44e0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
44f0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
4500: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
4510: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
4520: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
4530: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
4540: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
4550: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
4560: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
4570: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
4580: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
4590: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
45a0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
45b0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
45c0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20  .** unless this 
45d0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
45e0: 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67  able or initFlag
45f0: 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46  ==1.  When initF
4600: 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65  lag==1,.** it me
4610: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
4620: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
4630: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
4640: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
4650: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
4660: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
4670: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
4680: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
4690: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
46a0: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
46b0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
46c0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
46d0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
46e0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
46f0: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
4700: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
4710: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4720: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
4730: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
4740: 45 6e 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  End){.  Table *p
4750: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
4760: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4770: 69 66 28 20 70 45 6e 64 3d 3d 30 20 7c 7c 20 70  if( pEnd==0 || p
4780: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
4790: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
47a0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
47b0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
47c0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
47d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
47e0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
47f0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
4800: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
4810: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
4820: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
4830: 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73  pParse->nameClas
4840: 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  h==0 || pParse->
4850: 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  initFlag==1 );. 
4860: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
4870: 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73  lain==0 && pPars
4880: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20  e->nameClash==0 
4890: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
48a0: 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ld;.    pOld = s
48b0: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
48c0: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  &db->tblHash, p-
48d0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
48e0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
48f0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
4900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
4910: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
4920: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
4930: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 72 65  iled */.      re
4940: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
4950: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4960: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
4970: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
4980: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4990: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
49a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
49b0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
49c0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
49d0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
49e0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
49f0: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
4a00: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
4a10: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
4a20: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
4a30: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
4a40: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
4a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
4a60: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ble from the .  
4a70: 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e  ** pParse->newTn
4a80: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
4a90: 70 61 67 65 20 6e 75 6d 62 65 72 20 73 68 6f 75  page number shou
4aa0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
4ab0: 0a 20 20 2a 2a 20 74 68 65 72 65 20 62 79 20 74  .  ** there by t
4ac0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
4ad0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
4ae0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
4af0: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e  tFlag ){.    p->
4b00: 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tnum = pParse->n
4b10: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
4b20: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
4b30: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
4b40: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
4b50: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
4b60: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
4b70: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
4b80: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
4b90: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
4ba0: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
4bb0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6a 75 73 74  table, then just
4bc0: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
4bd0: 65 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 2a 2a 20  e.  Do not.  ** 
4be0: 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  make an entry in
4bf0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 0a   SQLITE_MASTER..
4c00: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
4c10: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
4c20: 20 20 20 20 69 6e 74 20 6e 2c 20 61 64 64 72 3b      int n, addr;
4c30: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  .    Vdbe *v;.. 
4c40: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
4c50: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
4c60: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
4c70: 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e  urn;.    n = (in
4c80: 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74  t)pEnd->z - (int
4c90: 29 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54  )pParse->sFirstT
4ca0: 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20  oken.z + 1;.    
4cb0: 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29  if( !p->isTemp )
4cc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
4cd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4ce0: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
4cf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4d00: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
4d10: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
4d20: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
4d30: 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65  P3(v, -1, "table
4d40: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
4d50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4d60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
4d70: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
4d80: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
4d90: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
4da0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
4db0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4dc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
4dd0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
4de0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
4df0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e  eP3(v, -1, p->zN
4e00: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
4e10: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
4e20: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
4e30: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  p(v, OP_CreateTa
4e40: 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ble, 0, 0);.    
4e50: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
4e60: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
4e70: 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  r *)&p->tnum, P3
4e80: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70  _POINTER);.    p
4e90: 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  ->tnum = 0;.    
4ea0: 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29  if( !p->isTemp )
4eb0: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  {.      addr = s
4ec0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4ed0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
4ee0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4ef0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
4f00: 61 64 64 72 2c 20 70 50 61 72 73 65 2d 3e 73 46  addr, pParse->sF
4f10: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
4f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4f30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4f40: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a  eRecord, 5, 0);.
4f50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c  AddOp(v, OP_Put,
4f70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 68   0, 0);.      ch
4f80: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
4f90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4fa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
4fb0: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 6e 65 78 74 5f  ookie, db->next_
4fc0: 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  cookie, 0);.    
4fd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4fe0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
4ff0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
5000: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
5010: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
5020: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
5030: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5040: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  OP_Commit, 0, 0)
5050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5060: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
5070: 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61  en, look up a ta
5080: 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61  ble with that na
5090: 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e  me.  If not foun
50a0: 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65  d, leave.** an e
50b0: 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72  rror for the par
50c0: 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20  ser to find and 
50d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
50e0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62  Table *sqliteTab
50f0: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73  leFromToken(Pars
5100: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5110: 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20   *pTok){.  char 
5120: 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20  *zName;.  Table 
5130: 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d  *pTab;.  zName =
5140: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
5150: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b  FromToken(pTok);
5160: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5170: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54  ) return 0;.  pT
5180: 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
5190: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
51a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
51b0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
51c0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
51d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
51e0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
51f0: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74  rMsg, "no such t
5200: 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20  able: ", 0, .   
5210: 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54       pTok->z, pT
5220: 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70  ok->n, 0);.    p
5230: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
5250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5260: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5270: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
5280: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
5290: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
52a0: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
52b0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
52c0: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
52d0: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54  void sqliteDropT
52e0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
52f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
5300: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
5310: 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  le;.  Vdbe *v;. 
5320: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c   int base;.  sql
5330: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
5340: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
5350: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
5360: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
5370: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  d ) return;.  pT
5380: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62  able = sqliteTab
5390: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
53a0: 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  se, pName);.  if
53b0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
53c0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
53d0: 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  le->readOnly ){.
53e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
53f0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
5400: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
5410: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a  pTable->zName, .
5420: 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74         " may not
5430: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
5440: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
5450: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
5460: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
5470: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
5480: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
5490: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
54a0: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
54b0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
54c0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
54d0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
54e0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
54f0: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
5500: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
5510: 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20  Write,  0, 2,   
5520: 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45       MASTER_NAME
5530: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
5540: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 30 2c 20  wind,     0, 0, 
5550: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
5560: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
5570: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
5580: 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20  }, /* 2 */.     
5590: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
55a0: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30    0, ADDR(9),  0
55b0: 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
55c0: 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20   { OP_Dup,      
55d0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
55e0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
55f0: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20  lumn,     0, 2, 
5600: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
5610: 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20   { OP_Ne,       
5620: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
5630: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
5640: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
5650: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
5660: 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20   { OP_Goto,     
5670: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
5680: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  },.      { OP_Se
5690: 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20  tCookie,  0, 0, 
56a0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20         0}, /* 9 
56b0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c  */.      { OP_Cl
56c0: 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ose,      0, 0, 
56d0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
56e0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
56f0: 78 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  x;.    if( (db->
5700: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
5710: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
5720: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5730: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
5740: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
5750: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5760: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
5770: 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65  Cookie, db->sche
5780: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  ma_cookie, 0);. 
5790: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68       pParse->sch
57a0: 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b  emaVerified = 1;
57b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
57c0: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29  pTable->isTemp )
57d0: 7b 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73  {.      base = s
57e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
57f0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
5800: 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70  dropTable), drop
5810: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
5820: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5830: 28 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62  (v, base+2, pTab
5840: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  le->zName, P3_ST
5850: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61  ATIC);.      cha
5860: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20  ngeCookie(db);. 
5870: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5880: 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b  hangeP1(v, base+
5890: 39 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  9, db->next_cook
58a0: 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ie);.    }.    s
58b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
58c0: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54  , OP_Destroy, pT
58d0: 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  able->tnum, pTab
58e0: 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20  le->isTemp);.   
58f0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65   for(pIdx=pTable
5900: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
5910: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
5920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
5930: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
5940: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
5950: 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  um, pTable->isTe
5960: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  mp);.    }.    i
5970: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
5980: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
5990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
59a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
59b0: 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  P_Commit, 0, 0);
59c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
59d0: 20 4d 61 72 6b 20 74 68 65 20 69 6e 2d 6d 65 6d   Mark the in-mem
59e0: 6f 72 79 20 54 61 62 6c 65 20 73 74 72 75 63 74  ory Table struct
59f0: 75 72 65 20 61 73 20 62 65 69 6e 67 20 64 65 6c  ure as being del
5a00: 65 74 65 64 2e 20 20 54 68 65 20 61 63 74 75 61  eted.  The actua
5a10: 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 69 6f  lly.  ** deletio
5a20: 6e 20 6f 63 63 75 72 73 20 69 6e 73 69 64 65 20  n occurs inside 
5a30: 6f 66 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49  of sqliteCommitI
5a40: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29  nternalChanges()
5a50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65  ..  **.  ** Exce
5a60: 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51  ption: if the SQ
5a70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61  L statement bega
5a80: 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41  n with the EXPLA
5a90: 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a  IN keyword,.  **
5aa0: 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   then no changes
5ab0: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e   should be made.
5ac0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
5ad0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
5ae0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 69 73 44 65      pTable->isDe
5af0: 6c 65 74 65 20 3d 20 31 3b 0a 20 20 20 20 64 62  lete = 1;.    db
5b00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
5b10: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
5b20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
5b30: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
5b40: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
5b50: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
5b60: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
5b70: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
5b80: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
5b90: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
5ba0: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
5bb0: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
5bc0: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
5bd0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
5be0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
5bf0: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
5c00: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
5c10: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
5c20: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
5c30: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
5c40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5c50: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
5c60: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
5c70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5c80: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
5c90: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
5ca0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
5cb0: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
5cc0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5cd0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
5ce0: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
5cf0: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
5d00: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
5d10: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
5d20: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
5d30: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
5d40: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
5d50: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
5d60: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
5d70: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
5d80: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5d90: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
5da0: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
5db0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5dc0: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
5dd0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
5de0: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
5df0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
5e00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
5e10: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
5e20: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  L */.  Token *pT
5e30: 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  able,   /* Name 
5e40: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5e50: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
5e60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
5e70: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
5e80: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
5e90: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
5ea0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
5eb0: 20 69 6e 74 20 69 73 55 6e 69 71 75 65 2c 20 20   int isUnique,  
5ec0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
5ed0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 69 73   entries in this
5ee0: 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 75   index must be u
5ef0: 6e 69 71 75 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  nique */.  Token
5f00: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
5f10: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
5f20: 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
5f30: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5f40: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
5f50: 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68  *pEnd      /* Th
5f60: 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
5f70: 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
5f80: 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
5f90: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
5fa0: 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
5fb0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
5fc0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
5fd0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
5fe0: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
5ff0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
6000: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
6010: 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
6020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
6030: 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
6040: 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
6050: 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  /.  sqlite *db =
6060: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
6070: 6e 74 20 68 69 64 65 4e 61 6d 65 20 3d 20 30 3b  nt hideName = 0;
6080: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
6090: 6f 74 20 70 75 74 20 74 61 62 6c 65 20 6e 61 6d  ot put table nam
60a0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
60b0: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ble */..  if( pP
60c0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
60d0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
60e0: 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
60f0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
6100: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
6110: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
6120: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
6130: 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
6140: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
6150: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
6160: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
6170: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame!=0 );.    pT
6180: 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61 62 6c  ab =  sqliteTabl
6190: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
61a0: 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  e, pTable);.  }e
61b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
61c0: 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
61d0: 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
61e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a  >pNewTable;.  }.
61f0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
6200: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
6210: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
6220: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
6230: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
6240: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
6250: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6260: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
6270: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
6280: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61      " may not ha
6290: 76 65 20 6e 65 77 20 69 6e 64 69 63 65 73 20 61  ve new indices a
62a0: 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  dded", 0);.    p
62b0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
62c0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
62d0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
62e0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
62f0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 77 68  ex is created wh
6300: 69 6c 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74  ile re-reading t
6310: 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 73  he schema from s
6320: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
6330: 2a 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  * but the table 
6340: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6350: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  this index is a 
6360: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
6370: 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c   it can.  ** onl
6380: 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
6390: 74 61 62 6c 65 20 74 68 69 73 20 69 6e 64 65 78  table this index
63a0: 20 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63   is really assoc
63b0: 69 61 74 65 64 20 77 69 74 68 20 69 73 20 6f 6e  iated with is on
63c0: 65 20 0a 20 20 2a 2a 20 77 68 6f 73 65 20 6e 61  e .  ** whose na
63d0: 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62 65 68  me is hidden beh
63e0: 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ind a temporary 
63f0: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
6400: 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53  ame name..  ** S
6410: 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65 20 68  ince its table h
6420: 61 73 20 62 65 65 6e 20 73 75 70 70 72 65 73 73  as been suppress
6430: 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61  ed, we need to a
6440: 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74 68 65  lso suppress the
6450: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a  .  ** index..  *
6460: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
6470: 69 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62  initFlag && pTab
6480: 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ->isTemp ){.    
6490: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
64a0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
64b0: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
64c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
64d0: 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
64e0: 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
64f0: 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
6500: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
6510: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
6520: 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
6530: 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
6540: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
6550: 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
6560: 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
6570: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
6580: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
6590: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
65a0: 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
65b0: 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
65c0: 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
65d0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
65e0: 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
65f0: 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
6600: 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
6610: 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
6620: 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
6630: 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
6640: 6e 64 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c  ndex, but we wil
6650: 6c 20 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65  l not.  ** store
6660: 20 69 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65   its name in the
6670: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65   hash table.  Se
6680: 74 20 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66  t the hideName f
6690: 6c 61 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73  lag to accomplis
66a0: 68 0a 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a  h.  ** this..  *
66b0: 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
66c0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
66d0: 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
66e0: 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
66f0: 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
6700: 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
6710: 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
6720: 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
6730: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
6740: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65  Name ){.    Inde
6750: 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
6760: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
6770: 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
6780: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62   name */.    Tab
6790: 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
67a0: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
67b0: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
67c0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
67d0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
67e0: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
67f0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  n(pName);.    if
6800: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
6810: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
6820: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49  dex;.    if( (pI
6830: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
6840: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
6850: 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Name))!=0 ){.   
6860: 20 20 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d     if( pISameNam
6870: 65 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  e->pTable->isTem
6880: 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69  p && pParse->ini
6890: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  tFlag ){.       
68a0: 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20   hideName = 1;. 
68b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
68c0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
68d0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
68e0: 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20  rMsg, "index ", 
68f0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
6900: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
6910: 73 74 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  sts", 0);.      
6920: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6930: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
6940: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
6950: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6960: 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e      if( (pTSameN
6970: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
6980: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29  Table(db, zName)
6990: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
69a0: 28 20 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73  ( pTSameName->is
69b0: 54 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e  Temp && pParse->
69c0: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
69d0: 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31      hideName = 1
69e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
69f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
6a00: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
6a10: 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20  zErrMsg, "there 
6a20: 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
6a30: 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20  le named ",.    
6a40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29         zName, 0)
6a50: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
6a60: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
6a70: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
6a80: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
6a90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
6aa0: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
6ab0: 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
6ac0: 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
6ad0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
6ae0: 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
6af0: 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
6b00: 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
6b10: 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
6b20: 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20  zBuf,"%d)",n);. 
6b30: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
6b40: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
6b50: 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70  g(&zName, "(", p
6b60: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75  Tab->zName, " au
6b70: 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c  toindex ", zBuf,
6b80: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   0);.    if( zNa
6b90: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
6ba0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
6bb0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69    }..  /* If pLi
6bc0: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
6bd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6be0: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
6bf0: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
6c00: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
6c10: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
6c20: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
6c30: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6c40: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
6c50: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
6c60: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
6c70: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
6c80: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
6c90: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
6ca0: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
6cb0: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
6cc0: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
6cd0: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
6ce0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70   sqliteIdListApp
6cf0: 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  end(0, &nullId);
6d00: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
6d10: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
6d20: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
6d30: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
6d40: 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
6d50: 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
6d60: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
6d70: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
6d80: 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
6d90: 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
6dc0: 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20  *pList->nId );. 
6dd0: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
6de0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
6df0: 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65  e_index;.  pInde
6e00: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
6e10: 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a  nt*)&pIndex[1];.
6e20: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
6e30: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
6e40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
6e50: 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79  ->nId];.  strcpy
6e60: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
6e70: 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
6e80: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
6e90: 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
6ea0: 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b  mn = pList->nId;
6eb0: 0a 20 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69  .  pIndex->isUni
6ec0: 71 75 65 20 3d 20 69 73 55 6e 69 71 75 65 3b 0a  que = isUnique;.
6ed0: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
6ee0: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
6ef0: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
6f00: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
6f10: 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
6f20: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
6f30: 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
6f40: 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
6f50: 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
6f60: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
6f70: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
6f80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
6f90: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
6fa0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6fb0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
6fc0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6fd0: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
6fe0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
6ff0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
7000: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7010: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
7020: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
7030: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
7040: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
7050: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
7060: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
7070: 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c      " has no col
7080: 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69  umn named ", pLi
7090: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
70a0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
70b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
70c0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
70d0: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
70e0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
70f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
7100: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
7110: 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = j;.  }..  /* L
7120: 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
7130: 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
7140: 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
7150: 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
7160: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
7170: 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
7180: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
7190: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 21 68  e->explain && !h
71a0: 69 64 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49  ideName ){.    I
71b0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
71c0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
71d0: 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20  t(&db->idxHash, 
71e0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
71f0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20  trlen(zName)+1, 
7200: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
7210: 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
7220: 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
7230: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
7240: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
7250: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
7260: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
7270: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
7280: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
7290: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
72a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
72b0: 67 65 73 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  ges;.  }.  pInde
72c0: 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
72d0: 3e 70 49 6e 64 65 78 3b 0a 20 20 70 54 61 62 2d  >pIndex;.  pTab-
72e0: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
72f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69  ;..  /* If the i
7300: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20  nitFlag is 1 it 
7310: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
7320: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
7330: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
7340: 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  e_master" table 
7350: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f  on the disk.  So
7360: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
7370: 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61   the disk.  ** a
7380: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
7390: 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  he table number 
73a0: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
73b0: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a  >newTnum field..
73c0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
73d0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 70  e->initFlag && p
73e0: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
73f0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 70  pIndex->tnum = p
7400: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a  Parse->newTnum;.
7410: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7420: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 74   initFlag is 0 t
7430: 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
7440: 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
7450: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
7460: 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
7470: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
7480: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
7490: 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
74a0: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
74b0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
74c0: 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
74d0: 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  ** The initFlag 
74e0: 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
74f0: 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
7500: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
7510: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54    ** command.  T
7520: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
7530: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
7540: 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
7550: 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
7560: 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
7570: 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
7580: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
7590: 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
75a0: 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
75b0: 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
75c0: 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
75d0: 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
75e0: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
75f0: 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
7600: 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d 30   ** If pTable==0
7610: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
7620: 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
7630: 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
7640: 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
7650: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
7660: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
7670: 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
7680: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
7690: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
76a0: 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
76b0: 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
76c0: 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
76d0: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
76e0: 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
76f0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
7700: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
7710: 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ag==0 ){.    int
7720: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
7730: 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c  .    int lbl1, l
7740: 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  bl2;.    int i;.
7750: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
7760: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 70    int isTemp = p
7770: 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a 20 20  Tab->isTemp;..  
7780: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
7790: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
77a0: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
77b0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
77c0: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ex;.    if( pTab
77d0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  le!=0 ){.      i
77e0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
77f0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
7800: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
7810: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7820: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
7830: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
7840: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7850: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
7860: 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  ie, db->schema_c
7870: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
7880: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
7890: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
78a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
78b0: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
78c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
78d0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
78e0: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
78f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
7900: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41  angeP3(v, -1, MA
7910: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
7920: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
7930: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
7940: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
7950: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7960: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
7970: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7980: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7990: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
79a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
79b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
79c0: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
79d0: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
79e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
79f0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
7a00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7a10: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7a20: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50  pIndex->zName, P
7a30: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
7a40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7a50: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7a60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7a70: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7a80: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
7a90: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
7aa0: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
7ab0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7ac0: 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
7ad0: 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  x, 0, isTemp);. 
7ae0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
7af0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
7b00: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74  char*)&pIndex->t
7b10: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
7b20: 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  ;.    pIndex->tn
7b30: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  um = 0;.    if( 
7b40: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
7b50: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
7b60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7b70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
7b80: 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20  WrAux, 1, 0);.  
7b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7ba0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7bb0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
7bc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
7bd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7be0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
7bf0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7c00: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65   }.    if( !isTe
7c10: 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  mp ){.      addr
7c20: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
7c30: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7c40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
7c50: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
7c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
7c70: 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28  (int)pEnd->z - (
7c80: 69 6e 74 29 70 53 74 61 72 74 2d 3e 7a 20 2b 20  int)pStart->z + 
7c90: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
7ca0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7cb0: 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a   addr, pStart->z
7cc0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
7cd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7ce0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
7cf0: 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20  cord, 5, 0);.   
7d00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7d10: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c  Op(v, OP_Put, 0,
7d20: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
7d30: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
7d40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7d50: 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f  Op(v, isTemp ? O
7d60: 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f  P_OpenAux : OP_O
7d70: 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  pen, 2, pTab->tn
7d80: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
7d90: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7da0: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
7db0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
7dc0: 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74      lbl1 = sqlit
7dd0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
7de0: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20  );.      lbl2 = 
7df0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
7e00: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
7e10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7e20: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 30   OP_Rewind, 2, 0
7e30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7e40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
7e50: 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  v, lbl1);.      
7e60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7e70: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
7e80: 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl2);.      sqli
7e90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7ea0: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
7eb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7ec0: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
7ed0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7ee0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7ef0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
7f00: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
7f10: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
7f20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
7f40: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
7f50: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
7f60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7f70: 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  p(v, OP_IdxPut, 
7f80: 31 2c 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69  1, pIndex->isUni
7f90: 71 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  que);.      sqli
7fa0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7fb0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 29  P_Goto, 0, lbl1)
7fc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7fd0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7fe0: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73  , lbl2);.      s
7ff0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8000: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
8010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8020: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
8030: 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
8040: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8050: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  p(v, OP_Close, 1
8060: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8070: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
8080: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54 65  .      if( !isTe
8090: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  mp ){.        ch
80a0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a  angeCookie(db);.
80b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
80c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
80d0: 74 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 6e 65 78  tCookie, db->nex
80e0: 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  t_cookie, 0);.  
80f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8100: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
8110: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
8120: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 64 62 2d  }.      if( (db-
8130: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8140: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
8150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8160: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
8170: 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  mit, 0, 0);.    
8180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8190: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
81a0: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
81b0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
81c0: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
81d0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
81e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
81f0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
8200: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8210: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
8220: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
8230: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
8240: 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50  qliteDropIndex(P
8250: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
8260: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ken *pName){.  I
8270: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
8280: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56  char *zName;.  V
8290: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
82a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
82b0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
82c0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
82d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
82e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65   return;.  zName
82f0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
8300: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
8310: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
8320: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
8330: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69  Index = sqliteFi
8340: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
8350: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
8360: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
8370: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
8380: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
8390: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
83a0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  g, "no such inde
83b0: 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  x: ", 0, .      
83c0: 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d    pName->z, pNam
83d0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  e->n, 0);.    pP
83e0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
83f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
8400: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
8410: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
8420: 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
8430: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
8440: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
8450: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
8460: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
8470: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
8480: 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20  pIndex[] = {.   
8490: 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74     { OP_OpenWrit
84a0: 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20  e,  0, 2,       
84b0: 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20  MASTER_NAME},.  
84c0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
84d0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
84e0: 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50   0}, .      { OP
84f0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
8500: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
8510: 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  2 */.      { OP_
8520: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
8530: 44 44 52 28 38 29 2c 20 30 7d 2c 20 2f 2a 20 33  DDR(8), 0}, /* 3
8540: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44   */.      { OP_D
8550: 75 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  up,        0, 0,
8560: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
8570: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
8580: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    0, 1,       0}
8590: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
85a0: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
85b0: 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
85c0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
85d0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
85e0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72        { OP_Destr
85f0: 6f 79 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  oy,    0, 0,    
8600: 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20     0}, /* 8 */. 
8610: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
8620: 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  kie,  0, 0,     
8630: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
8640: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
8650: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
8660: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
8670: 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61  int base;.    Ta
8680: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
8690: 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20  ex->pTable;..   
86a0: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
86b0: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
86c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
86d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
86e0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
86f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
8700: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8710: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
8720: 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  , db->schema_coo
8730: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  kie, 0);.      p
8740: 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72  Parse->schemaVer
8750: 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ified = 1;.    }
8760: 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e  .    if( !pTab->
8770: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
8780: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
8790: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
87a0: 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65  raySize(dropInde
87b0: 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a  x), dropIndex);.
87c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
87d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
87e0: 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +2, pIndex->zNam
87f0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
8800: 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69       changeCooki
8810: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  e(db);.      sql
8820: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28  iteVdbeChangeP1(
8830: 76 2c 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e  v, base+9, db->n
8840: 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20  ext_cookie);.   
8850: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
8860: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
8870: 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  troy, pIndex->tn
8880: 75 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70  um, pTab->isTemp
8890: 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  );.    if( (db->
88a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
88b0: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
88c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
88d0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
88e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
88f0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
8900: 65 20 69 6e 74 65 72 6e 61 6c 20 49 6e 64 65 78  e internal Index
8910: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64   structure for d
8920: 65 6c 65 74 69 6f 6e 20 62 79 20 74 68 65 0a 20  eletion by the. 
8930: 20 2a 2a 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74   ** sqliteCommit
8940: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 20  InternalChanges 
8950: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
8960: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
8970: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 70 49 6e 64  lain ){.    pInd
8980: 65 78 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 31  ex->isDelete = 1
8990: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
89a0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
89b0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
89c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
89d0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
89e0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
89f0: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
8a00: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
8a10: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
8a20: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
8a30: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
8a40: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
8a50: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
8a60: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8a70: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
8a80: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
8a90: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
8aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
8ab0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
8ac0: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
8ad0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
8ae0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  st==0 ){.      s
8af0: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
8b00: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
8b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
8b20: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
8b30: 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29 7b  nExpr & 7)==0 ){
8b40: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
8b50: 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a 20  st->nExpr + 8;. 
8b60: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8b70: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
8b80: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
8b90: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  c(pList->a, n*si
8ba0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
8bb0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
8bc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8bd0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
8be0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8bf0: 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pList;.    }.   
8c00: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
8c10: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c   }.  if( pExpr |
8c20: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  | pName ){.    i
8c30: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b   = pList->nExpr+
8c40: 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  +;.    pList->a[
8c50: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
8c60: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  ;.    pList->a[i
8c70: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
8c80: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
8c90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
8ca0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
8cb0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
8cc0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
8cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
8ce0: 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  uote(pList->a[i]
8cf0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
8d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
8d10: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
8d20: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
8d30: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
8d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
8d50: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
8d60: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
8d70: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
8d80: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
8d90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
8da0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8db0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
8dc0: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
8dd0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  .pExpr);.    sql
8de0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
8df0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
8e00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
8e10: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
8e20: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
8e30: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
8e40: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
8e50: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
8e60: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
8e70: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
8e80: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
8e90: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
8ea0: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
8eb0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
8ec0: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
8ed0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
8ee0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
8ef0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
8f00: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8f10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8f20: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
8f30: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
8f40: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
8f50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
8f60: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
8f70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
8f80: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
8f90: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
8fa0: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
8fb0: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
8fc0: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
8fd0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
8fe0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
8ff0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
9000: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
9010: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
9020: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
9030: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
9040: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
9050: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
9060: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
9070: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
9080: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
9090: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
90a0: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
90b0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
90c0: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
90d0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
90e0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
90f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
9100: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
9110: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
9120: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9130: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
9140: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
9150: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
9160: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
9170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
9180: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
9190: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
91a0: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
91b0: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
91c0: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
91d0: 41 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20  AddAlias(IdList 
91e0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
91f0: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
9200: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49  ist && pList->nI
9210: 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  d>0 ){.    int i
9220: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20   = pList->nId - 
9230: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
9240: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
9250: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
9260: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
9270: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
9280: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
9290: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
92a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
92b0: 65 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69  e an entire IdLi
92c0: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
92d0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
92e0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
92f0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
9300: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
9310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
9320: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
9330: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
9340: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
9350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
9360: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
9370: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ias);.    if( pL
9380: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
9390: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
93a0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
93b0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
93c0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
93d0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
93e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
93f0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
9400: 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
9410: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
9420: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
9430: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
9440: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
9450: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
9460: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
9470: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
9480: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
9490: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
94a0: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
94b0: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
94c0: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
94d0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
94e0: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
94f0: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
9500: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
9510: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
9520: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
9530: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
9540: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
9550: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
9560: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
9570: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
9580: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
9590: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
95a0: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
95b0: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
95c0: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
95d0: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
95e0: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
95f0: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
9600: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
9610: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
9620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9630: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
9640: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
9650: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
9660: 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  e,   /* The name
9670: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
9680: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
9690: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
96a0: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
96b0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
96c0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
96d0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
96e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
96f0: 6d 69 74 65 72 20 20 20 20 2f 2a 20 55 73 65 20  miter    /* Use 
9700: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
9710: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29  d delimiter */.)
9720: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
9730: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20  .  char *zTab;. 
9740: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62   int i, j;.  Vdb
9750: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72  e *v;.  int addr
9760: 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a  , end;.  Index *
9770: 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a  pIdx;.  sqlite *
9780: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9790: 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74  ..  zTab = sqlit
97a0: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
97b0: 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b  ken(pTableName);
97c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
97d0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a  lloc_failed || z
97e0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f  Tab==0 ) goto co
97f0: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54  py_cleanup;.  pT
9800: 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
9810: 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 29 3b 0a  able(db, zTab);.
9820: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
9830: 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  b);.  if( pTab==
9840: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
9850: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
9860: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
9870: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
9880: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  , .        pTabl
9890: 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65  eName->z, pTable
98a0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
98b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
98c0: 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63  .    goto copy_c
98d0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66  leanup;.  }.  if
98e0: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
98f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
9900: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
9910: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
9920: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
9930: 0a 20 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e  .        " may n
9940: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c  ot be modified",
9950: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
9960: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
9970: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
9980: 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
9990: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
99a0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
99b0: 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20  int openOp;.    
99c0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
99d0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
99e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
99f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9a00: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
9a10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
9a20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9a30: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
9a40: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
9a50: 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ie, 0);.      pP
9a60: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
9a70: 66 69 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  fied = 1;.    }.
9a80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
9a90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9aa0: 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29  _FileOpen, 0, 0)
9ab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
9ac0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
9ad0: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20  , pFilename->z, 
9ae0: 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20  pFilename->n);. 
9af0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
9b00: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
9b10: 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54  .    openOp = pT
9b20: 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f  ab->isTemp ? OP_
9b30: 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f  OpenWrAux : OP_O
9b40: 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71  penWrite;.    sq
9b50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9b60: 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62   openOp, 0, pTab
9b70: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
9b80: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
9b90: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
9ba0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
9bb0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
9bc0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
9bd0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9be0: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
9bf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9c00: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69  dOp(v, openOp, i
9c10: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
9c20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
9c30: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
9c40: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
9c50: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
9c60: 20 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64    end = sqliteVd
9c70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
9c80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
9c90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9ca0: 5f 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d  _FileRead, pTab-
9cb0: 3e 6e 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20  >nCol, end);.   
9cc0: 20 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20   if( pDelimiter 
9cd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
9ce0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
9cf0: 64 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d  ddr, pDelimiter-
9d00: 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e  >z, pDelimiter->
9d10: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
9d20: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
9d30: 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73   addr);.    }els
9d40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e{.      sqliteV
9d50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
9d60: 64 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20  ddr, "\t", 1);. 
9d70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
9d80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
9d90: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
9da0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49      if( pTab->pI
9db0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  ndex ){.      sq
9dc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9dd0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
9de0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
9df0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
9e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
9e10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9e20: 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69  OP_FileColumn, i
9e30: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
9e40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9e50: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9e60: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 29  , pTab->nCol, 0)
9e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
9e80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c  AddOp(v, OP_Put,
9e90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28   0, 0);.    for(
9ea0: 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=1, pIdx=pTab->
9eb0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9ec0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
9ed0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9ee0: 70 49 64 78 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pIdx->pNext ){. 
9ef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9f00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
9f10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
9f20: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9f30: 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
9f40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   j++){.        s
9f50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9f60: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
9f70: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9f80: 6a 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  j], 0);.      }.
9f90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9fa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
9fb0: 49 64 78 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 43  IdxKey, pIdx->nC
9fc0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
9fd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9fe0: 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 69  (v, OP_IdxPut, i
9ff0: 2c 20 70 49 64 78 2d 3e 69 73 55 6e 69 71 75 65  , pIdx->isUnique
a000: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a010: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a020: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
a030: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
a040: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a050: 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74   end);.    sqlit
a060: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a070: 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
a080: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
a090: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
a0a0: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)==0 ){.      s
a0b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a0c0: 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20  , OP_Commit, 0, 
a0d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
a0e0: 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20  .copy_cleanup:. 
a0f0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
a100: 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61  * The non-standa
a110: 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  rd VACUUM comman
a120: 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65  d is used to cle
a130: 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61  an up the databa
a140: 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20  se,.** collapse 
a150: 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e  free space, etc.
a160: 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64    It is modelled
a170: 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55   after the VACUU
a180: 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20  M command.** in 
a190: 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2f 0a 76  PostgreSQL..*/.v
a1a0: 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d  oid sqliteVacuum
a1b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a1c0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
a1d0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
a1e0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
a1f0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
a200: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
a210: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
a220: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
a230: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
a240: 20 69 66 28 20 70 54 61 62 6c 65 4e 61 6d 65 20   if( pTableName 
a250: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
a260: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
a270: 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61  omToken(pTableNa
a280: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
a290: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
a2a0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20  .  if( zName && 
a2b0: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
a2c0: 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 0a 20 20  db, zName)==0.  
a2d0: 20 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64 54    && sqliteFindT
a2e0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3d  able(db, zName)=
a2f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a300: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
a310: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
a320: 73 75 63 68 20 74 61 62 6c 65 20 6f 72 20 69 6e  such table or in
a330: 64 65 78 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 30  dex: ", zName, 0
a340: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
a350: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
a360: 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a  vacuum_cleanup;.
a370: 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
a380: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a390: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
a3a0: 74 6f 20 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75  to vacuum_cleanu
a3b0: 70 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  p;.  if( (db->fl
a3c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
a3d0: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
a3e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a3f0: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
a400: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  n, 0, 0);.    sq
a410: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a420: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
a430: 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  , db->schema_coo
a440: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  kie, 0);.    pPa
a450: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
a460: 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  ied = 1;.  }.  i
a470: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
a480: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a490: 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65  v, OP_Reorganize
a4a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
a4b0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
a4c0: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74  v, -1, zName, st
a4d0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
a4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 61 62 6c 65  }else{.    Table
a4f0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65   *pTab;.    Inde
a500: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73  x *pIdx;.    Has
a510: 68 45 6c 65 6d 20 2a 70 45 3b 0a 20 20 20 20 66  hElem *pE;.    f
a520: 6f 72 28 70 45 3d 73 71 6c 69 74 65 48 61 73 68  or(pE=sqliteHash
a530: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
a540: 73 68 29 3b 20 70 45 3b 20 70 45 3d 73 71 6c 69  sh); pE; pE=sqli
a550: 74 65 48 61 73 68 4e 65 78 74 28 70 45 29 29 7b  teHashNext(pE)){
a560: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
a570: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 29  liteHashData(pE)
a580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
a5a0: 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 29 3b  organize, 0, 0);
a5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
a5c0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
a5d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
a5e0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a5f0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
a600: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
a610: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
a620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a630: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
a640: 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 29 3b  organize, 0, 0);
a650: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
a660: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
a670: 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
a680: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
a690: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a6a0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
a6b0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
a6c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a6d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a6e0: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
a6f0: 20 20 7d 0a 0a 76 61 63 75 75 6d 5f 63 6c 65 61    }..vacuum_clea
a700: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nup:.  sqliteFre
a710: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
a720: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rn;.}../*.** Beg
a730: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
a740: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
a750: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
a760: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
a770: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
a780: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
a790: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
a7a0: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
a7b0: 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20  || db->pBe==0 ) 
a7c0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
a7d0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
a7e0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
a7f0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
a800: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
a810: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 20  QLITE_InTrans ) 
a820: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
a830: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
a840: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
a850: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a860: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
a870: 63 74 69 6f 6e 2c 20 31 2c 20 30 29 3b 0a 20 20  ction, 1, 0);.  
a880: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a890: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
a8a0: 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61  okie, db->schema
a8b0: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
a8c0: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
a8d0: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  erified = 1;.  }
a8e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
a8f0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
a900: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
a910: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
a920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
a930: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
a940: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
a950: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
a960: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
a970: 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
a980: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
a990: 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65   db->pBe==0 ) re
a9a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
a9b0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
a9c0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
a9d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
a9e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
a9f0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
aa00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
aa10: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
aa20: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
aa30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
aa40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
aa50: 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 0, 0);.  }.
aa60: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
aa70: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
aa80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
aa90: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
aaa0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f  */.void sqliteRo
aab0: 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
aac0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
aad0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
aae0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
aaf0: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
ab00: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
ab10: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
ab20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ab30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
ab40: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
ab50: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
ab60: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
ab70: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ab80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
ab90: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
aba0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
abb0: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
abc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
abd0: 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29  _Rollback, 0, 0)
abe0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
abf0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
ac00: 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rans;.}../*.** I
ac10: 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76  nterpret the giv
ac20: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 62  en string as a b
ac30: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f  oolean value..*/
ac40: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 42  .static int getB
ac50: 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b  oolean(char *z){
ac60: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
ac70: 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65  azTrue[] = { "ye
ac80: 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65 22  s", "on", "true"
ac90: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   };.  int i;.  i
aca0: 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74  f( z[0]==0 ) ret
acb0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 64  urn 0;.  if( isd
acc0: 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a  igit(z[0]) || (z
acd0: 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69  [0]=='-' && isdi
ace0: 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20  git(z[1])) ){.  
acf0: 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29    return atoi(z)
ad00: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
ad10: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75 65   i<sizeof(azTrue
ad20: 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b  )/sizeof(azTrue[
ad30: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
ad40: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
ad50: 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30  (z,azTrue[i])==0
ad60: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
ad70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ad80: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
ad90: 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74  pragma statement
ada0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61  .  .**.** Pragma
adb0: 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f  s are of this fo
adc0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  rm:.**.**      P
add0: 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75 65  RAGMA id = value
ade0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74  .**.** The ident
adf0: 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f  ifier might also
ae00: 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54   be a string.  T
ae10: 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  he value is a st
ae20: 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65  ring, and.** ide
ae30: 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75  ntifier, or a nu
ae40: 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46  mber.  If minusF
ae50: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
ae60: 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a  n the value is.*
ae70: 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20  * a number that 
ae80: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
ae90: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f  a minus sign..*/
aea0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61 67  .void sqlitePrag
aeb0: 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
aec0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20  , Token *pLeft, 
aed0: 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20 69  Token *pRight, i
aee0: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
aef0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
af00: 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  ;.  char *zRight
af10: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a   = 0;.  sqlite *
af20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
af30: 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69  ..  zLeft = sqli
af40: 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d  teStrNDup(pLeft-
af50: 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20  >z, pLeft->n);. 
af60: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
af70: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e  Left);.  if( min
af80: 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52  usFlag ){.    zR
af90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  ight = 0;.    sq
afa0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
afb0: 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20  zRight, "-", 1, 
afc0: 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68  pRight->z, pRigh
afd0: 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  t->n, 0);.  }els
afe0: 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20  e{.    zRight = 
aff0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52  sqliteStrNDup(pR
b000: 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d  ight->z, pRight-
b010: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  >n);.    sqliteD
b020: 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a  equote(zRight);.
b030: 20 20 7d 0a 20 0a 20 20 69 66 28 20 73 71 6c 69    }. .  if( sqli
b040: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
b050: 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30  "cache_size")==0
b060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65   ){.    int size
b070: 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b   = atoi(zRight);
b080: 0a 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65  .    sqliteBtree
b090: 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d  SetCacheSize(db-
b0a0: 3e 70 42 65 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  >pBe, size);.  }
b0b0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
b0c0: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
b0d0: 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d   "vdbe_trace")==
b0e0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
b0f0: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
b100: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
b110: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62  gs |= SQLITE_Vdb
b120: 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73  eTrace;.    }els
b130: 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
b140: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64  gs &= ~SQLITE_Vd
b150: 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20  beTrace;.    }. 
b160: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
b170: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
b180: 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  t, "full_column_
b190: 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  names")==0 ){.  
b1a0: 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
b1b0: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
b1c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
b1d0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
b1e0: 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  es;.    }else{. 
b1f0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
b200: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
b210: 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20  lNames;.    }.  
b220: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
b230: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
b240: 2c 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  , "count_changes
b250: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
b260: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
b270: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
b280: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
b290: 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20  _CountRows;.    
b2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
b2b0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
b2c0: 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20  E_CountRows;.   
b2d0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
b2e0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
b2f0: 7a 4c 65 66 74 2c 20 22 65 6d 70 74 79 5f 72 65  zLeft, "empty_re
b300: 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 22 29  sult_callbacks")
b310: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
b320: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b330: 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
b340: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4e  lags |= SQLITE_N
b350: 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  ullCallback;.   
b360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
b370: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
b380: 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b  TE_NullCallback;
b390: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
b3a0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
b3b0: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c  Cmp(zLeft, "tabl
b3c0: 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20  e_info")==0 ){. 
b3d0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b3e0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
b3f0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
b400: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67  ndTable(db, zRig
b410: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ht);.    if( pTa
b420: 62 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65  b ) v = sqliteGe
b430: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
b440: 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 76     if( pTab && v
b450: 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
b460: 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66   VdbeOp tableInf
b470: 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20  oPreface[] = {. 
b480: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
b490: 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c 20 20  mnCount, 5, 0,  
b4a0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20       0},.       
b4b0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
b4c0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  0, 0,       "
b4d0: 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  cid"},.        {
b4e0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
b4f0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61   1, 0,       "na
b500: 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  me"},.        { 
b510: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
b520: 32 2c 20 30 2c 20 20 20 20 20 20 20 22 74 79 70  2, 0,       "typ
b530: 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
b540: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 33  P_ColumnName,  3
b550: 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 6f 74 6e  , 0,       "notn
b560: 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ull"},.        {
b570: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
b580: 20 34 2c 20 30 2c 20 20 20 20 20 20 20 22 64 66   4, 0,       "df
b590: 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20 20 20  lt_value"},.    
b5a0: 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69    };.      int i
b5b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b5c0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
b5d0: 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e  rraySize(tableIn
b5e0: 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c  foPreface), tabl
b5f0: 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20  eInfoPreface);. 
b600: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b610: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
b620: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b630: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b640: 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a  Integer, i, 0);.
b650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b660: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
b670: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
b680: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
b690: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
b6a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
b6b0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
b6c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b6d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
b6e0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
b6f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
b700: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 0a  hangeP3(v, -1, .
b710: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
b720: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3f  >aCol[i].zType ?
b730: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
b740: 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c 20 50  Type : "text", P
b750: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
b760: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b770: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
b780: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
b790: 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20  notNull, 0);.   
b7a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b7b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
b7c0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
b7d0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
b7e0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
b7f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c  ->aCol[i].zDflt,
b800: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
b810: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b820: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
b830: 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20  ack, 5, 0);.    
b840: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b850: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
b860: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69  trICmp(zLeft, "i
b870: 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29  ndex_info")==0 )
b880: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
b890: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
b8a0: 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
b8b0: 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69  .    pIdx = sqli
b8c0: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
b8d0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
b8e0: 20 70 49 64 78 20 29 20 76 20 3d 20 73 71 6c 69   pIdx ) v = sqli
b8f0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
b900: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
b910: 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
b920: 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
b930: 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
b940: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
b950: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20  ColumnCount, 3, 
b960: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
b970: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b980: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
b990: 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20     "seqno"},.   
b9a0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b9b0: 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20  Name,  1, 0,    
b9c0: 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
b9d0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
b9e0: 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
b9f0: 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
ba00: 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  };.      int i;.
ba10: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64        pTab = pId
ba20: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  x->pTable;.     
ba30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ba40: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
ba50: 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  e(tableInfoPrefa
ba60: 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72  ce), tableInfoPr
ba70: 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66 6f  eface);.      fo
ba80: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
ba90: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
baa0: 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d        int cnum =
bab0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
bac0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
bad0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bae0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
baf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bb00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bb10: 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30  Integer, cnum, 0
bb20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bb30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
bb40: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
bb50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
bb60: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
bb70: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  , pTab->aCol[cnu
bb80: 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  m].zName, P3_STA
bb90: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
bba0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
bbb0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c   OP_Callback, 3,
bbc0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
bbd0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
bbe0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
bbf0: 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 6c 69  zLeft, "index_li
bc00: 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  st")==0 ){.    I
bc10: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
bc20: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
bc30: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54   Vdbe *v;.    pT
bc40: 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
bc50: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29  able(db, zRight)
bc60: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
bc70: 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  {.      v = sqli
bc80: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
bc90: 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  );.      pIdx = 
bca0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
bcb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
bcc0: 20 26 26 20 70 49 64 78 20 26 26 20 76 20 29 7b   && pIdx && v ){
bcd0: 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30  .      int i = 0
bce0: 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ; .      static 
bcf0: 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69 73 74  VdbeOp indexList
bd00: 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
bd10: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
bd20: 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20  nCount, 3, 0,   
bd30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20      0},.        
bd40: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
bd50: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73    0, 0,       "s
bd60: 65 71 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  eq"},.        { 
bd70: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
bd80: 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
bd90: 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
bda0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
bdb0: 2c 20 30 2c 20 20 20 20 20 20 20 22 75 6e 69 71  , 0,       "uniq
bdc0: 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a  ue"},.      };..
bdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
bde0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
bdf0: 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74  aySize(indexList
be00: 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c  Preface), indexL
be10: 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20  istPreface);.   
be20: 20 20 20 77 68 69 6c 65 28 70 49 64 78 29 7b 0a     while(pIdx){.
be30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
be40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
be50: 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
be60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
be70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
be80: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
be90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
bea0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
beb0: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
bec0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
bed0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
bee0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
bef0: 78 2d 3e 69 73 55 6e 69 71 75 65 2c 20 30 29 3b  x->isUnique, 0);
bf00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
bf10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
bf20: 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
bf30: 09 2b 2b 69 3b 0a 09 70 49 64 78 20 3d 20 70 49  .++i;..pIdx = pI
bf40: 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  dx->pNext;.     
bf50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
bf60: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
bf70: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
bf80: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72  ICmp(zLeft, "par
bf90: 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  ser_trace")==0 )
bfa0: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
bfb0: 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72  d sqliteParserTr
bfc0: 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20  ace(FILE*, char 
bfd0: 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42  *);.    if( getB
bfe0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
bff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 61  {.      sqlitePa
c000: 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75 74  rserTrace(stdout
c010: 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20  , "parser: ");. 
c020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c030: 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
c040: 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e(0, 0);.    }. 
c050: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
c060: 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65   {}.  sqliteFree
c070: 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  (zLeft);.  sqlit
c080: 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d  eFree(zRight);.}
c090: 0a                                               .