/ Hex Artifact Content
Login

Artifact 707f6ef58dcdd50ead9ead914d673b08e7121bc5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 65 78 70 72 65    creating expre
0290: 73 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69  ssions and ID li
02a0: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02b0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02c0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02d0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02e0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02f0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
0300: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0310: 69 6c 64 2e 63 2c 76 20 31 2e 34 36 20 32 30 30  ild.c,v 1.46 200
0320: 31 2f 31 30 2f 30 39 20 30 34 3a 31 39 3a 34 37  1/10/09 04:19:47
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0820: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0830: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0840: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0850: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
0860: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
0870: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0880: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0890: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
08a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
08b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
08c0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
08d0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
08e0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
08f0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0900: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0910: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0920: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0930: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0940: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0950: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0960: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0980: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b    pNew->op = op;
0990: 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d  .  pNew->pLeft =
09a0: 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e   pLeft;.  pNew->
09b0: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
09c0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
09d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
09e0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
09f0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  lse{.    pNew->t
0a00: 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20  oken.z = "";.   
0a10: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d   pNew->token.n =
0a20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
0a30: 65 66 74 20 26 26 20 70 52 69 67 68 74 20 29 7b  eft && pRight ){
0a40: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 53  .    sqliteExprS
0a50: 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74  pan(pNew, &pLeft
0a60: 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d  ->span, &pRight-
0a70: 3e 73 70 61 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  >span);.  }else{
0a80: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20  .    pNew->span 
0a90: 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20  = pNew->token;. 
0aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
0ac0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69  he Expr.token fi
0ad0: 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eld of the given
0ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
0af0: 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20  pan all.** text 
0b00: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
0b10: 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f  given tokens..*/
0b20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
0b30: 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72  Span(Expr *pExpr
0b40: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20  , Token *pLeft, 
0b50: 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a  Token *pRight){.
0b60: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
0b70: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
0b80: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
0b90: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
0ba0: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 69 6e   pRight->n + (in
0bb0: 74 29 70 52 69 67 68 74 2d 3e 7a 20 2d 20 28 69  t)pRight->z - (i
0bc0: 6e 74 29 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 7d  nt)pLeft->z;.  }
0bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
0be0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
0bf0: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
0c00: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
0c10: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
0c20: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
0c30: 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e  liteExprFunction
0c40: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
0c50: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
0c60: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
0c70: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
0c80: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
0c90: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
0ca0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
0cb0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0cc0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
0cd0: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
0ce0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
0cf0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
0d00: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
0d10: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
0d20: 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20  token.z = "";.  
0d30: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20    pNew->token.n 
0d40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0d50: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0d60: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
0d70: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
0d80: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
0d90: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
0da0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
0db0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0dc0: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
0dd0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
0de0: 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  e(p->pLeft);.  i
0df0: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73  f( p->pRight ) s
0e00: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0e10: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66  p->pRight);.  if
0e20: 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c  ( p->pList ) sql
0e30: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
0e40: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69  e(p->pList);.  i
0e50: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20  f( p->pSelect ) 
0e60: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
0e70: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
0e80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
0ea0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
0eb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
0ec0: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
0ed0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
0ee0: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  e table given th
0ef0: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61  e name.** of tha
0f00: 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  t table.  Return
0f10: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
0f20: 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  nd..*/.Table *sq
0f30: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71  liteFindTable(sq
0f40: 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a  lite *db, char *
0f50: 7a 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  zName){.  Table 
0f60: 2a 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46  *p = sqliteHashF
0f70: 69 6e 64 28 26 64 62 2d 3e 74 62 6c 48 61 73 68  ind(&db->tblHash
0f80: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
0f90: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 72 65 74  zName)+1);.  ret
0fa0: 75 72 6e 20 28 70 3d 3d 30 20 7c 7c 20 70 2d 3e  urn (p==0 || p->
0fb0: 69 73 44 65 6c 65 74 65 29 20 3f 20 30 20 3a 20  isDelete) ? 0 : 
0fc0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0fd0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0fe0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0ff0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1000: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1010: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1020: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
1030: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1040: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
1050: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
1060: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1070: 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  , char *zName){.
1080: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 73 71 6c    Index *p = sql
1090: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
10a0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
10b0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
10c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 3d 3d  );.  return (p==
10d0: 30 20 7c 7c 20 70 2d 3e 69 73 44 65 6c 65 74 65  0 || p->isDelete
10e0: 29 20 3f 20 30 20 3a 20 70 3b 0a 7d 0a 0a 2f 2a  ) ? 0 : p;.}../*
10f0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67  .** Remove the g
1100: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
1110: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
1120: 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a  able, and free.*
1130: 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72  * its memory str
1140: 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  uctures..**.** T
1150: 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f  he index is remo
1160: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
1170: 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65  abase hash table
1180: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 0a 2a 2a   if db!=NULL..**
1190: 20 42 75 74 20 74 68 65 20 69 6e 64 65 78 20 69   But the index i
11a0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
11b0: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
11c0: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
11d0: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
11e0: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
11f0: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
1200: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
1210: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1220: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
1230: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1240: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1250: 69 66 28 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  if( pIndex->zNam
1260: 65 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 73  e && db ){.    s
1270: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1280: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49  &db->idxHash, pI
1290: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
12a0: 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
12b0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e)+1, 0);.  }.  
12c0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
12d0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  x);.}../*.** Unl
12e0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ink the given in
12f0: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62  dex from its tab
1300: 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a  le, then remove.
1310: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ** the index fro
1320: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
1330: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
1340: 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74  its memory.** st
1350: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  ructures..*/.sta
1360: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55  tic void sqliteU
1370: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1380: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
1390: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
13a0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
13b0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
13c0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64  ndex ){.    pInd
13d0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
13e0: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
13f0: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
1400: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66   Index *p;.    f
1410: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
1420: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
1430: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
1440: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
1450: 7d 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70  }.    if( p && p
1460: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
1470: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
1480: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
1490: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
14a0: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
14b0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a  (db, pIndex);.}.
14c0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
14d0: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
14e0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
14f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
1500: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
1510: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
1520: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
1530: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
1550: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
1560: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
1570: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
1580: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
1590: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
15a0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
15b0: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
15c0: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
15d0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
15e0: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73   the indices ass
15f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1600: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   table..**.** In
1610: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
1620: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1630: 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  are unlinked fro
1640: 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61  m the "db".** da
1650: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
1660: 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62  db!=NULL.  If db
1670: 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20  ==NULL, indices 
1680: 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74  attached to.** t
1690: 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c  he table are del
16a0: 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  eted, but it is 
16b0: 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76  assumed they hav
16c0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  e already been.*
16d0: 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76  * unlinked..*/.v
16e0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
16f0: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
1700: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
1710: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64  {.  int i;.  Ind
1720: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
1730: 78 74 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  xt;.  if( pTable
1740: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1750: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
1760: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
1770: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
1780: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  able->aCol[i].zN
1790: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
17a0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
17b0: 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20  l[i].zDflt);.   
17c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
17d0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  le->aCol[i].zTyp
17e0: 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49  e);.  }.  for(pI
17f0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
1800: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1810: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
1820: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
1830: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
1840: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1850: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
1860: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1870: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
1880: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1890: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
18a0: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
18b0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
18c0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
18d0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
18e0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
18f0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
1900: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
1910: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 0a 2a  l its indices..*
1920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1930: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
1940: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
1950: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
1960: 6c 65 29 7b 0a 20 20 69 66 28 20 70 54 61 62 6c  le){.  if( pTabl
1970: 65 2d 3e 7a 4e 61 6d 65 20 26 26 20 64 62 20 29  e->zName && db )
1980: 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  {.    sqliteHash
1990: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
19a0: 61 73 68 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ash, pTable->zNa
19b0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 54 61 62 6c  me, strlen(pTabl
19c0: 65 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  e->zName)+1, 0);
19d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
19e0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
19f0: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ble);.}../*.** C
1a00: 68 65 63 6b 20 61 6c 6c 20 54 61 62 6c 65 73 20  heck all Tables 
1a10: 61 6e 64 20 49 6e 64 65 78 65 73 20 69 6e 20 74  and Indexes in t
1a20: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
1a30: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6d 6d 69   table and commi
1a40: 74 0a 2a 2a 20 61 6e 79 20 61 64 64 69 74 69 6f  t.** any additio
1a50: 6e 73 20 6f 72 20 64 65 6c 65 74 69 6f 6e 73 20  ns or deletions 
1a60: 74 6f 20 74 68 6f 73 65 20 68 61 73 68 20 74 61  to those hash ta
1a70: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  bles..**.** When
1a80: 20 65 78 65 63 75 74 69 6e 67 20 43 52 45 41 54   executing CREAT
1a90: 45 20 54 41 42 4c 45 20 61 6e 64 20 43 52 45 41  E TABLE and CREA
1aa0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1ab0: 6e 74 73 2c 20 74 68 65 20 54 61 62 6c 65 0a 2a  nts, the Table.*
1ac0: 2a 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72 75  * and Index stru
1ad0: 63 74 75 72 65 73 20 61 72 65 20 63 72 65 61 74  ctures are creat
1ae0: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
1af0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 2c  the hash tables,
1b00: 20 62 75 74 0a 2a 2a 20 74 68 65 20 22 69 73 43   but.** the "isC
1b10: 6f 6d 6d 69 74 22 20 66 69 65 6c 64 20 69 73 20  ommit" field is 
1b20: 6e 6f 74 20 73 65 74 2e 20 20 54 68 69 73 20 72  not set.  This r
1b30: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 6f 73  outine sets thos
1b40: 65 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 57 68 65  e fields..** Whe
1b50: 6e 20 65 78 65 63 75 74 69 6e 67 20 44 52 4f 50  n executing DROP
1b60: 20 54 41 42 4c 45 20 61 6e 64 20 44 52 4f 50 20   TABLE and DROP 
1b70: 49 4e 44 45 58 2c 20 74 68 65 20 22 69 73 44 65  INDEX, the "isDe
1b80: 6c 65 74 65 22 20 66 69 65 6c 64 73 20 6f 66 0a  lete" fields of.
1b90: 2a 2a 20 54 61 62 6c 65 20 61 6e 64 20 49 6e 64  ** Table and Ind
1ba0: 65 78 20 73 74 72 75 63 74 75 72 65 73 20 69 73  ex structures is
1bb0: 20 73 65 74 20 62 75 74 20 74 68 65 20 73 74 72   set but the str
1bc0: 75 63 74 75 72 65 73 20 61 72 65 20 6e 6f 74 20  uctures are not 
1bd0: 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 20 66 72 6f 6d  unlinked.** from
1be0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
1bf0: 20 6e 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64   nor deallocated
1c00: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1c10: 68 61 6e 64 6c 65 73 20 74 68 61 74 0a 2a 2a 20  handles that.** 
1c20: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 0a 2a  deallocation. .*
1c30: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
1c40: 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74  qliteRollbackInt
1c50: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a  ernalChanges().*
1c60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d  /.void sqliteCom
1c70: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
1c80: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
1c90: 20 20 48 61 73 68 20 74 6f 44 65 6c 65 74 65 3b    Hash toDelete;
1ca0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
1cb0: 65 6d 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  em;.  if( (db->f
1cc0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
1cd0: 74 65 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20  ternChanges)==0 
1ce0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1cf0: 74 65 48 61 73 68 49 6e 69 74 28 26 74 6f 44 65  teHashInit(&toDe
1d00: 6c 65 74 65 2c 20 53 51 4c 49 54 45 5f 48 41 53  lete, SQLITE_HAS
1d10: 48 5f 50 4f 49 4e 54 45 52 2c 20 30 29 3b 0a 20  H_POINTER, 0);. 
1d20: 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b   db->schema_cook
1d30: 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  ie = db->next_co
1d40: 6f 6b 69 65 3b 0a 20 20 66 6f 72 28 70 45 6c 65  okie;.  for(pEle
1d50: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1d60: 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b  t(&db->tblHash);
1d70: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1d80: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1d90: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
1da0: 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  *pTable = sqlite
1db0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1dc0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
1dd0: 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  >isDelete ){.   
1de0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
1df0: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
1e00: 54 61 62 6c 65 2c 20 30 2c 20 70 54 61 62 6c 65  Table, 0, pTable
1e10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 69 73 43 6f      pTable->isCo
1e30: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  mmit = 1;.    }.
1e40: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
1e50: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1e60: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
1e70: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
1e80: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
1e90: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1ea0: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
1eb0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
1ec0: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
1ed0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1ee0: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
1ef0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
1f00: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
1f10: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
1f20: 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61  First(&db->idxHa
1f30: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
1f40: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1f50: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
1f60: 62 6c 65 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  ble *pIndex = sq
1f70: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1f80: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  em);.    if( pIn
1f90: 64 65 78 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  dex->isDelete ){
1fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
1fb0: 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65 74  hInsert(&toDelet
1fc0: 65 2c 20 70 49 6e 64 65 78 2c 20 30 2c 20 70 49  e, pIndex, 0, pI
1fd0: 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ndex);.    }else
1fe0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1ff0: 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  isCommit = 1;.  
2000: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45    }.  }.  for(pE
2010: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2020: 72 73 74 28 26 74 6f 44 65 6c 65 74 65 29 3b 20  rst(&toDelete); 
2030: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2040: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2050: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
2060: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48  pIndex = sqliteH
2070: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2080: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
2090: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
20a0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
20b0: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
20c0: 72 28 26 74 6f 44 65 6c 65 74 65 29 3b 0a 20 20  r(&toDelete);.  
20d0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
20e0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
20f0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
2100: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
2110: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
2120: 43 52 45 41 54 45 20 54 41 42 4c 45 2c 20 43 52  CREATE TABLE, CR
2130: 45 41 54 45 20 49 4e 44 45 58 2c 0a 2a 2a 20 44  EATE INDEX,.** D
2140: 52 4f 50 20 54 41 42 4c 45 2c 20 6f 72 20 44 52  ROP TABLE, or DR
2150: 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
2160: 6e 74 73 20 67 65 74 73 20 72 6f 6c 6c 65 64 20  nts gets rolled 
2170: 62 61 63 6b 2e 20 20 54 68 65 0a 2a 2a 20 61 64  back.  The.** ad
2180: 64 69 74 69 6f 6e 73 20 6f 72 20 64 65 6c 65 74  ditions or delet
2190: 69 6f 6e 73 20 6f 66 20 54 61 62 6c 65 20 61 6e  ions of Table an
21a0: 64 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  d Index structur
21b0: 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 74  es in the.** int
21c0: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
21d0: 73 20 61 72 65 20 75 6e 64 6f 6e 65 2e 0a 2a 2a  s are undone..**
21e0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
21f0: 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  liteCommitIntern
2200: 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f 0a 76  alChanges().*/.v
2210: 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61  oid sqliteRollba
2220: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
2230: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2240: 20 48 61 73 68 20 74 6f 44 65 6c 65 74 65 3b 0a   Hash toDelete;.
2250: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2260: 6d 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  m;.  if( (db->fl
2270: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
2280: 65 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20 29  ernChanges)==0 )
2290: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
22a0: 65 48 61 73 68 49 6e 69 74 28 26 74 6f 44 65 6c  eHashInit(&toDel
22b0: 65 74 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ete, SQLITE_HASH
22c0: 5f 50 4f 49 4e 54 45 52 2c 20 30 29 3b 0a 20 20  _POINTER, 0);.  
22d0: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20  db->next_cookie 
22e0: 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  = db->schema_coo
22f0: 6b 69 65 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  kie;.  for(pElem
2300: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2310: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  (&db->tblHash); 
2320: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2330: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2340: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
2350: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 48  pTable = sqliteH
2360: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2370: 20 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d      if( !pTable-
2380: 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  >isCommit ){.   
2390: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
23a0: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
23b0: 54 61 62 6c 65 2c 20 30 2c 20 70 54 61 62 6c 65  Table, 0, pTable
23c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23d0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 69 73 44 65      pTable->isDe
23e0: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lete = 0;.    }.
23f0: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
2400: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2410: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
2420: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2430: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2440: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2450: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
2460: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2470: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2480: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2490: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
24a0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
24b0: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
24c0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
24d0: 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48 61  First(&db->idxHa
24e0: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
24f0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2500: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
2510: 62 6c 65 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  ble *pIndex = sq
2520: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2530: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49  em);.    if( !pI
2540: 6e 64 65 78 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  ndex->isCommit )
2550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
2560: 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65 6c 65  shInsert(&toDele
2570: 74 65 2c 20 70 49 6e 64 65 78 2c 20 30 2c 20 70  te, pIndex, 0, p
2580: 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73  Index);.    }els
2590: 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e{.      pIndex-
25a0: 3e 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20  >isDelete = 0;. 
25b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
25c0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
25d0: 69 72 73 74 28 26 74 6f 44 65 6c 65 74 65 29 3b  irst(&toDelete);
25e0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
25f0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
2600: 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
2610: 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  *pIndex = sqlite
2620: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
2630: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
2640: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
2650: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
2660: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
2670: 61 72 28 26 74 6f 44 65 6c 65 74 65 29 3b 0a 20  ar(&toDelete);. 
2680: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2690: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
26a0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ges;.}../*.** Co
26b0: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
26c0: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
26d0: 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61   or index from a
26e0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
26f0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2700: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
2710: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
2720: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
2730: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
2740: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2750: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
2760: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
2770: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
2780: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
2790: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
27a0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
27b0: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
27c0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
27d0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
27e0: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
27f0: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
2800: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
2810: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
2820: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
2830: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
2840: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
2850: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
2860: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
2870: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
2880: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
2890: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
28a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
28b0: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
28c0: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
28d0: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
28e0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
28f0: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
2900: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
2910: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
2920: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
2930: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
2940: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
2950: 20 69 66 20 74 68 65 20 22 54 45 4d 50 22 20 6f   if the "TEMP" o
2960: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
2970: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
2980: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
2990: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
29a0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
29b0: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
29c0: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
29d0: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
29e0: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
29f0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
2a00: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
2a10: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
2a20: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
2a30: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
2a40: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
2a50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2a60: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
2a70: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
2a80: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
2a90: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
2aa0: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
2ab0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2ac0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
2ad0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
2ae0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
2af0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
2b00: 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  id sqliteStartTa
2b10: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
2b20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  e, Token *pStart
2b30: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
2b40: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54  int isTemp){.  T
2b50: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
2b60: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
2b70: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
2b80: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
2b90: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
2ba0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69  ;..  pParse->sFi
2bb0: 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61  rstToken = *pSta
2bc0: 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  rt;.  zName = sq
2bd0: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
2be0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
2bf0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
2c00: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
2c10: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63  fore trying to c
2c20: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2c30: 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75  y table, make su
2c40: 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72  re the Btree for
2c50: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65  .  ** holding te
2c60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69  mporary tables i
2c70: 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  s open..  */.  i
2c80: 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d  f( isTemp && db-
2c90: 3e 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  >pBeTemp==0 ){. 
2ca0: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2cb0: 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  teBtreeOpen(0, 0
2cc0: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
2cd0: 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20  ->pBeTemp);.    
2ce0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cf0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2d00: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2d10: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
2d20: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
2d30: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
2d40: 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
2d50: 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
2d60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
2d70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
2d80: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
2d90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2da0: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
2db0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
2dc0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
2dd0: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
2de0: 6e 54 72 61 6e 73 28 64 62 2d 3e 70 42 65 54 65  nTrans(db->pBeTe
2df0: 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mp);.      if( r
2e00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
2e20: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
2e30: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
2e40: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
2e50: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
2e60: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
2e70: 72 61 72 79 20 64 61 74 62 61 73 65 20 66 69 6c  rary datbase fil
2e80: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2e90: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
2ea0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ec0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
2ed0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
2ee0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
2ef0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
2f00: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
2f10: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e  x or table name.
2f20: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
2f30: 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 64   message if it d
2f40: 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oes..  **.  ** I
2f50: 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61 64  f we are re-read
2f60: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
2f70: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
2f80: 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a  use of a schema.
2f90: 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20    ** change and 
2fa0: 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20  a new permanent 
2fb0: 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77  table is found w
2fc0: 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64  hose name collid
2fd0: 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  es with.  ** an 
2fe0: 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61  existing tempora
2ff0: 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69  ry table, then i
3000: 67 6e 6f 72 65 20 74 68 65 20 6e 65 77 20 70 65  gnore the new pe
3010: 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20  rmanent table.. 
3020: 20 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74   ** We will cont
3030: 69 6e 75 65 20 70 61 72 73 69 6e 67 2c 20 62 75  inue parsing, bu
3040: 74 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 61  t the pParse->na
3050: 6d 65 43 6c 61 73 68 20 66 6c 61 67 20 77 69 6c  meClash flag wil
3060: 6c 20 62 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f  l be set.  ** so
3070: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f   we will know to
3080: 20 64 69 73 63 61 72 64 20 74 68 65 20 74 61 62   discard the tab
3090: 6c 65 20 72 65 63 6f 72 64 20 6f 6e 63 65 20 70  le record once p
30a0: 61 72 73 69 6e 67 20 68 61 73 20 66 69 6e 69 73  arsing has finis
30b0: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  hed..  */.  pTab
30c0: 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  le = sqliteFindT
30d0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  able(db, zName);
30e0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
30f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62   ){.    if( pTab
3100: 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50  le->isTemp && pP
3110: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
3120: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
3130: 6e 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20  nameClash = 1;. 
3140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3150: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3160: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3170: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20  g, "table ", 0, 
3180: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3190: 3e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20  >n,.          " 
31a0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
31b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
31c0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
31d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
31e0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
31f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  urn;.    }.  }el
3200: 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  se{.    pParse->
3210: 6e 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20  nameClash = 0;. 
3220: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
3230: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
3240: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
3250: 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 21 70  &&.          (!p
3260: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54  Idx->pTable->isT
3270: 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e  emp || !pParse->
3280: 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20  initFlag) ){.   
3290: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
32a0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
32b0: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
32c0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
32d0: 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a  med ", .       z
32e0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
32f0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
3300: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3310: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
3320: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
3330: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
3340: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
3350: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
3360: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
3370: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
3380: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
3390: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
33a0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
33b0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  le->pIndex = 0;.
33c0: 20 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70    pTable->isTemp
33d0: 20 3d 20 69 73 54 65 6d 70 3b 0a 20 20 69 66 28   = isTemp;.  if(
33e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
33f0: 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74  le ) sqliteDelet
3400: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
3410: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
3420: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
3430: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 69  le = pTable;.  i
3440: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
3450: 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73 71 6c  Flag && (v = sql
3460: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
3470: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  e))!=0 ){.    if
3480: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
3490: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
34a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
34b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
34c0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
34d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
34e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
34f0: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
3500: 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f  kie, db->schema_
3510: 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30 29  cookie, 0, 0, 0)
3520: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3530: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
3540: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
3550: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
3560: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3570: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
3580: 74 65 2c 20 30 2c 20 32 2c 20 4d 41 53 54 45 52  te, 0, 2, MASTER
3590: 5f 4e 41 4d 45 2c 20 30 29 3b 0a 20 20 20 20 7d  _NAME, 0);.    }
35a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
35b0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
35c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
35d0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
35e0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
35f0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
3600: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
3610: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3620: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
3630: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
3640: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
3650: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
3660: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
3670: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
3680: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
3690: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
36a0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
36b0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
36c0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
36d0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
36e0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
36f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
3700: 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66   char **pz;.  if
3710: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
3720: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
3730: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d  eturn;.  if( (p-
3740: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
3750: 29 7b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  ){.    p->aCol =
3760: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
3770: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
3780: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
3790: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
37a0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a  ( p->aCol==0 ){.
37b0: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
37c0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  0;.      return;
37d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d  .    }.  }.  mem
37e0: 73 65 74 28 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  set(&p->aCol[p->
37f0: 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nCol], 0, sizeof
3800: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
3810: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70   pz = &p->aCol[p
3820: 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b  ->nCol++].zName;
3830: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
3840: 69 6e 67 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a  ing(pz, pName->z
3850: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
3860: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
3870: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  *pz);.}../*.** T
3880: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3890: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
38a0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
38b0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
38c0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
38d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
38e0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
38f0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
3900: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
3910: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
3920: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
3930: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
3940: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
3950: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3960: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3970: 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75  d sqliteAddNotNu
3980: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
3990: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
39a0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70   int i;.  if( (p
39b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
39c0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
39d0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
39e0: 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  -1;.  if( i>=0 )
39f0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e   p->aCol[i].notN
3a00: 75 6c 6c 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ull = 1;.}../*.*
3a10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3a20: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
3a30: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
3a40: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
3a50: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
3a60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
3a70: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
3a80: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
3a90: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
3aa0: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
3ab0: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
3ac0: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
3ad0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
3ae0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
3af0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
3b00: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
3b10: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
3b20: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
3b30: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
3b40: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
3b50: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
3b60: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
3b70: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
3b80: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
3b90: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
3ba0: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
3bb0: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  iteAddColumnType
3bc0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3bd0: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54  Token *pFirst, T
3be0: 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20  oken *pLast){.  
3bf0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
3c00: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  i, j;.  int n;. 
3c10: 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a   char *z, **pz;.
3c20: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3c30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3c40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
3c50: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
3c60: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
3c70: 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b    pz = &p->aCol[
3c80: 69 5d 2e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  i].zType;.  n = 
3c90: 70 4c 61 73 74 2d 3e 6e 20 2b 20 28 28 69 6e 74  pLast->n + ((int
3ca0: 29 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 28 69 6e  )pLast->z) - (in
3cb0: 74 29 70 46 69 72 73 74 2d 3e 7a 3b 0a 20 20 73  t)pFirst->z;.  s
3cc0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3cd0: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
3ce0: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
3cf0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
3d00: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
3d10: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
3d20: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
3d30: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
3d40: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
3d50: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
3d60: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
3d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76  }../*.** The giv
3d80: 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  en token is the 
3d90: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
3da0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
3db0: 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  n added to.** th
3dc0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
3dd0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
3de0: 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73  tion.  If "minus
3df0: 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20 69  Flag" is true, i
3e00: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76  t.** means the v
3e10: 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70  alue token was p
3e20: 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e  receded by a min
3e30: 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54  us sign..**.** T
3e40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3e50: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3e60: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
3e70: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
3e80: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
3e90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
3ea0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
3eb0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
3ec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
3ed0: 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69  en *pVal, int mi
3ee0: 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c  nusFlag){.  Tabl
3ef0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
3f00: 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66   char **pz;.  if
3f10: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
3f20: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
3f30: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
3f40: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
3f50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a  0 ) return;.  pz
3f60: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   = &p->aCol[i].z
3f70: 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75  Dflt;.  if( minu
3f80: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  sFlag ){.    sql
3f90: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
3fa0: 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e  , "-", 1, pVal->
3fb0: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
3fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
3fd0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
3fe0: 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d  , pVal->z, pVal-
3ff0: 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  >n, 0);.  }.  sq
4000: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
4010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20  ;.}../*.** Come 
4020: 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61  up with a new ra
4030: 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74  ndom value for t
4040: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
4050: 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20  .  Make sure.** 
4060: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73  the new value is
4070: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
4080: 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  the old..**.** T
4090: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
40a0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
40b0: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
40c0: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
40d0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
40e0: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
40f0: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
4100: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
4110: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
4120: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
4130: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
4140: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
4150: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
4160: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
4170: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
4180: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
4190: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
41a0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
41b0: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
41c0: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
41d0: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
41e0: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
41f0: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
4200: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
4210: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
4220: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
4230: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
4240: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
4250: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
4260: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
4270: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
4280: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
4290: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
42a0: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
42b0: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
42c0: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
42d0: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
42e0: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
42f0: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
4300: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
4310: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 73  afe enough..*/.s
4320: 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67  tatic void chang
4330: 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a  eCookie(sqlite *
4340: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  db){.  if( db->n
4350: 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e  ext_cookie==db->
4360: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b  schema_cookie ){
4370: 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  .    db->next_co
4380: 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d  okie = db->schem
4390: 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74  a_cookie + sqlit
43a0: 65 52 61 6e 64 6f 6d 42 79 74 65 28 64 62 29 20  eRandomByte(db) 
43b0: 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  + 1;.    db->fla
43c0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
43d0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
43f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4400: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
4410: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
4420: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
4430: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4440: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
4450: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
4460: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
4470: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
4480: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
4490: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
44a0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
44b0: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
44c0: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
44d0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
44e0: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
44f0: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
4500: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
4510: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20  ble on disk,.** 
4520: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
4530: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4540: 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e   or initFlag==1.
4550: 20 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d    When initFlag=
4560: 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  =1,.** it means 
4570: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
4580: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
4590: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
45a0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
45b0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
45c0: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
45d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
45e0: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
45f0: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
4600: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
4610: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
4620: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
4630: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4640: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
4650: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
4660: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2f  ate it again..*/
4670: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54  .void sqliteEndT
4680: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
4690: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 29  se, Token *pEnd)
46a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
46b0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
46c0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
46d0: 70 45 6e 64 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pEnd==0 || pPars
46e0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
46f0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
4700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
4710: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4720: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
4730: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64  return;..  /* Ad
4740: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
4750: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
4760: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
4770: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
4780: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
4790: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30  se->nameClash==0
47a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   || pParse->init
47b0: 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
47c0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
47d0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
47e0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20  ameClash==0 ){. 
47f0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
4800: 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68  ert(&db->tblHash
4810: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
4820: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
4830: 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  p);.    pParse->
4840: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
4850: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
4860: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
4870: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
4880: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
4890: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61  * If the initFla
48a0: 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  g is 1 it means 
48b0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
48c0: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
48d0: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
48e0: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
48f0: 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f   disk.  So do no
4900: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
4910: 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20  isk.  ** again. 
4920: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
4930: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t page number fo
4940: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
4950: 20 74 68 65 20 0a 20 20 2a 2a 20 70 50 61 72 73   the .  ** pPars
4960: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
4970: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
4980: 62 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ber should have 
4990: 62 65 65 6e 20 70 75 74 0a 20 20 2a 2a 20 74 68  been put.  ** th
49a0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
49b0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
49c0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
49d0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
49e0: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70  .    p->tnum = p
49f0: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a  Parse->newTnum;.
4a00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
4a10: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
4a20: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
4a30: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
4a40: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
4a50: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
4a60: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
4a70: 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  abase..  **.  **
4a80: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
4a90: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 74  MPORARY table, t
4aa0: 68 65 6e 20 6a 75 73 74 20 63 72 65 61 74 65 20  hen just create 
4ab0: 74 68 65 20 74 61 62 6c 65 2e 20 20 44 6f 20 6e  the table.  Do n
4ac0: 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 6e 20  ot.  ** make an 
4ad0: 65 6e 74 72 79 20 69 6e 20 53 51 4c 49 54 45 5f  entry in SQLITE_
4ae0: 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69  MASTER..  */.  i
4af0: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
4b00: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Flag ){.    int 
4b10: 6e 2c 20 61 64 64 72 3b 0a 20 20 20 20 56 64 62  n, addr;.    Vdb
4b20: 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73  e *v;..    v = s
4b30: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
4b40: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
4b50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
4b60: 20 6e 20 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e   n = (int)pEnd->
4b70: 7a 20 2d 20 28 69 6e 74 29 70 50 61 72 73 65 2d  z - (int)pParse-
4b80: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 20 2b  >sFirstToken.z +
4b90: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e   1;.    if( !p->
4ba0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
4bb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4bc0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
4bd0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
4be0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4bf0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
4c00: 20 30 2c 20 30 2c 20 22 74 61 62 6c 65 22 2c 20   0, 0, "table", 
4c10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4c20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c30: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d  String, 0, 0, p-
4c40: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4c50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4c60: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
4c70: 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  0, 0, p->zName, 
4c80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  0);.    }.    ad
4c90: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
4ca0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
4cb0: 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30 2c  eTable, 0, 0, 0,
4cc0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4cd0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
4ce0: 64 64 72 2c 20 28 63 68 61 72 20 2a 29 26 70 2d  ddr, (char *)&p-
4cf0: 3e 74 6e 75 6d 2c 20 2d 31 29 3b 0a 20 20 20 20  >tnum, -1);.    
4d00: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  p->tnum = 0;.   
4d10: 20 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20   if( !p->isTemp 
4d20: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
4d30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4d40: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
4d50: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
4d60: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
4d70: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 50 61  eP3(v, addr, pPa
4d80: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
4d90: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71  .z, n);.      sq
4da0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4db0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4dc0: 35 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  5, 0, 0, 0);.   
4dd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4de0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c  Op(v, OP_Put, 0,
4df0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
4e00: 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62   changeCookie(db
4e10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4e20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4e30: 65 74 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 6e 65  etCookie, db->ne
4e40: 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c  xt_cookie, 0, 0,
4e50: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4e60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4e70: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c  _Close, 0, 0, 0,
4e80: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
4e90: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
4ea0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
4eb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4ec0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4ed0: 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20  P_Commit, 0, 0, 
4ee0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
4ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
4f00: 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70  a token, look up
4f10: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
4f20: 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74  at name.  If not
4f30: 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a   found, leave.**
4f40: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68   an error for th
4f50: 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64  e parser to find
4f60: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4f70: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
4f80: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
4f90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4fa0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
4fb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
4fc0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e  able *pTab;.  zN
4fd0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
4fe0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
4ff0: 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Tok);.  if( zNam
5000: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
5010: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
5020: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
5030: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
5040: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
5050: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
5060: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
5070: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
5080: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
5090: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c  uch table: ", 0,
50a0: 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e   .        pTok->
50b0: 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a  z, pTok->n, 0);.
50c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
50d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
50e0: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
50f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5100: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
5110: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
5120: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5130: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
5140: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5150: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
5160: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5170: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
5180: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5190: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
51a0: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
51b0: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
51c0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
51d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
51e0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
51f0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
5200: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5210: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
5220: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
5230: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b  (pParse, pName);
5240: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
5250: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5260: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
5270: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
5280: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
5290: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
52a0: 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e ", pTable->zNa
52b0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61  me, .       " ma
52c0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
52d0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
52e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
52f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
5300: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5310: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
5320: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
5330: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
5340: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
5350: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
5360: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
5370: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
5380: 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b  dbeOp dropTable[
5390: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
53a0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20  _OpenWrite,  0, 
53b0: 32 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45 52  2,        MASTER
53c0: 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20  _NAME},.      { 
53d0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
53e0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
53f0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
5400: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
5410: 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a      0}, /* 2 */.
5420: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
5430: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
5440: 29 2c 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a  ),  0}, /* 3 */.
5450: 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
5460: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
5470: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
5480: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
5490: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
54a0: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
54b0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
54c0: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
54d0: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
54e0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
54f0: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
5500: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
5510: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
5520: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30  OP_SetCookie,  0
5530: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
5540: 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 9 */.      { 
5550: 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30  OP_Close,      0
5560: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
5570: 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78      };.    Index
5580: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 66 28 20   *pIdx;.    if( 
5590: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
55a0: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
55b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
55c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
55d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
55e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
55f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5600: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
5610: 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e, db->schema_co
5620: 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  okie, 0, 0, 0);.
5630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63        pParse->sc
5640: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
5650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5660: 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  !pTable->isTemp 
5670: 29 7b 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20  ){.      base = 
5680: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
5690: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
56a0: 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f  (dropTable), dro
56b0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  pTable);.      s
56c0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
56d0: 33 28 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61  3(v, base+2, pTa
56e0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
56f0: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
5700: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71  ie(db);.      sq
5710: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31  liteVdbeChangeP1
5720: 28 76 2c 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e  (v, base+9, db->
5730: 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20  next_cookie);.  
5740: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
5750: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
5760: 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74  stroy, pTable->t
5770: 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54  num, pTable->isT
5780: 65 6d 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  emp, 0, 0);.    
5790: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
57a0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
57b0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
57c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
57d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
57e0: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
57f0: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
5800: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p, 0, 0);.    }.
5810: 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61      if( (db->fla
5820: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
5830: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ans)==0 ){.     
5840: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5850: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
5860: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5870: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
5880: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 54   the in-memory T
5890: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
58a0: 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  s being deleted.
58b0: 20 20 54 68 65 20 61 63 74 75 61 6c 6c 79 0a 20    The actually. 
58c0: 20 2a 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63   ** deletion occ
58d0: 75 72 73 20 69 6e 73 69 64 65 20 6f 66 20 73 71  urs inside of sq
58e0: 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  liteCommitIntern
58f0: 61 6c 43 68 61 6e 67 65 73 28 29 2e 0a 20 20 2a  alChanges()..  *
5900: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
5910: 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61  : if the SQL sta
5920: 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74  tement began wit
5930: 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  h the EXPLAIN ke
5940: 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  yword,.  ** then
5950: 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75   no changes shou
5960: 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ld be made..  */
5970: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
5980: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 70  explain ){.    p
5990: 54 61 62 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20  Table->isDelete 
59a0: 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  = 1;.    db->fla
59b0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
59c0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
59d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
59e0: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
59f0: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
5a00: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
5a10: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
5a20: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
5a30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5a40: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
5a50: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
5a60: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
5a70: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
5a80: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
5a90: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
5aa0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
5ab0: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
5ac0: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
5ad0: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
5ae0: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
5af0: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
5b00: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
5b10: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
5b20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
5b30: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
5b40: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
5b50: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
5b60: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
5b70: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
5b80: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
5b90: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
5ba0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
5bb0: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
5bc0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
5bd0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
5be0: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
5bf0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
5c00: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
5c10: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
5c20: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
5c30: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
5c40: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5c50: 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
5c60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5c70: 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
5c80: 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
5c90: 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
5ca0: 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  pName,    /* Nam
5cb0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
5cc0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
5cd0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
5ce0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
5cf0: 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  e table to index
5d00: 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  .  Use pParse->p
5d10: 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
5d20: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  .  IdList *pList
5d30: 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
5d40: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
5d50: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
5d60: 69 73 55 6e 69 71 75 65 2c 20 20 20 20 2f 2a 20  isUnique,    /* 
5d70: 54 72 75 65 20 69 66 20 61 6c 6c 20 65 6e 74 72  True if all entr
5d80: 69 65 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  ies in this inde
5d90: 78 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  x must be unique
5da0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
5db0: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
5dc0: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
5dd0: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
5de0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5df0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
5e00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
5e10: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
5e20: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
5e30: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
5e40: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
5e50: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
5e60: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
5e70: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a  ex *pIndex;   /*
5e80: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
5e90: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
5ea0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
5eb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
5ec0: 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20  en nullId;      
5ed0: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
5ee0: 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
5ef0: 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73  y ID list */.  s
5f00: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
5f10: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69  se->db;.  int hi
5f20: 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  deName = 0;     
5f30: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75      /* Do not pu
5f40: 74 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  t table name in 
5f50: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  the hash table *
5f60: 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
5f70: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
5f80: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
5f90: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
5fa0: 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20  _index;..  /*.  
5fb0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
5fc0: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
5fd0: 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
5fe0: 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
5ff0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
6000: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
6010: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d   assert( pName!=
6020: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
6030: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
6040: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54  Token(pParse, pT
6050: 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
6060: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
6070: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
6080: 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   =  pParse->pNew
6090: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Table;.  }.  if(
60a0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
60b0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
60c0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
60d0: 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
60e0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
60f0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
6100: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
6110: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
6120: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22  >zName, .      "
6130: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65   may not have ne
6140: 77 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22  w indices added"
6150: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
6160: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
6170: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
6180: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
6190: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
61a0: 20 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72   created while r
61b0: 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63  e-reading the sc
61c0: 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65  hema from sqlite
61d0: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74  _master.  ** but
61e0: 20 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63   the table assoc
61f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
6200: 69 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f  index is a tempo
6210: 72 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63  rary table, it c
6220: 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61  an.  ** only mea
6230: 6e 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  n that the table
6240: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 72   this index is r
6250: 65 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65 64  eally associated
6260: 20 77 69 74 68 20 69 73 20 6f 6e 65 20 0a 20 20   with is one .  
6270: 2a 2a 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73  ** whose name is
6280: 20 68 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61   hidden behind a
6290: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
62a0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
62b0: 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ame..  ** Since 
62c0: 69 74 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  its table has be
62d0: 65 6e 20 73 75 70 70 72 65 73 73 65 64 2c 20 77  en suppressed, w
62e0: 65 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73  e need to also s
62f0: 75 70 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a  uppress the.  **
6300: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
6310: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
6320: 6c 61 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54  lag && pTab->isT
6330: 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  emp ){.    goto 
6340: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
6350: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
6360: 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
6370: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
6380: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
6390: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
63a0: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
63b0: 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
63c0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
63d0: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
63e0: 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
63f0: 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
6400: 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
6410: 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
6420: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
6430: 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
6440: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
6450: 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
6460: 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
6470: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
6480: 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
6490: 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
64a0: 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
64b0: 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
64c0: 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
64d0: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
64e0: 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c  cess this index,
64f0: 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74   but we will not
6500: 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20  .  ** store its 
6510: 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68  name in the hash
6520: 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65   table.  Set the
6530: 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74   hideName flag t
6540: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a  o accomplish.  *
6550: 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  * this..  **.  *
6560: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
6570: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
6580: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
6590: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
65a0: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
65b0: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
65c0: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
65d0: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
65e0: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
65f0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
6600: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
6610: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
6620: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
6630: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
6640: 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
6650: 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
6660: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
6670: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d  ndex */.    zNam
6680: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
6690: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
66a0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
66b0: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
66c0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
66d0: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
66e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
66f0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
6700: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
6710: 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54  ( pISameName->pT
6720: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  able->isTemp && 
6730: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
6740: 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65   ){.        hide
6750: 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Name = 1;.      
6760: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6770: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
6780: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
6790: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
67a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  , .           " 
67b0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
67c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
67d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
67e0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
67f0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
6800: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6810: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
6820: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
6830: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
6840: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53  ){.      if( pTS
6850: 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20  ameName->isTemp 
6860: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
6870: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
6880: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
6890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
68b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
68c0: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
68d0: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
68e0: 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  med ",.         
68f0: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
6900: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
6910: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
6920: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
6930: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
6940: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6950: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6960: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
6970: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
6980: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
6990: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
69a0: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
69b0: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
69c0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
69d0: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
69e0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
69f0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
6a00: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
6a10: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
6a20: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
6a30: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
6a40: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
6a50: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
6a60: 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
6a70: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
6a80: 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
6a90: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
6aa0: 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
6ab0: 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
6ac0: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
6ad0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
6ae0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
6af0: 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
6b00: 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
6b10: 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
6b20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
6b30: 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
6b40: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
6b50: 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
6b60: 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
6b70: 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
6b80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6b90: 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30  teIdListAppend(0
6ba0: 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
6bb0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
6bc0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
6bd0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
6be0: 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
6bf0: 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
6c00: 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e  ure. .  */.  pIn
6c10: 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
6c20: 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  oc( sizeof(Index
6c30: 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ) + strlen(zName
6c40: 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20  ) + 1 +.        
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73  sizeof(int)*pLis
6c70: 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20  t->nId );.  if( 
6c80: 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f  pIndex==0 ) goto
6c90: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
6ca0: 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ex;.  pIndex->ai
6cb0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
6cc0: 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e  pIndex[1];.  pIn
6cd0: 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
6ce0: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ar*)&pIndex->aiC
6cf0: 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64  olumn[pList->nId
6d00: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
6d10: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
6d20: 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
6d30: 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
6d40: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
6d50: 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49  pList->nId;.  pI
6d60: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
6d70: 20 69 73 55 6e 69 71 75 65 3b 0a 0a 20 20 2f 2a   isUnique;..  /*
6d80: 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
6d90: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
6da0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
6db0: 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
6dc0: 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
6dd0: 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
6de0: 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
6df0: 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
6e00: 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
6e10: 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
6e20: 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  found..  */.  fo
6e30: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
6e40: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  nId; i++){.    f
6e50: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
6e60: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
6e70: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
6e80: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
6e90: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
6ea0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
6eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6ec0: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
6ed0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
6ee0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
6ef0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
6f00: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
6f10: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22  Name, .        "
6f20: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
6f30: 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61  amed ", pList->a
6f40: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  [i].zName, 0);. 
6f50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
6f60: 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r++;.      sqlit
6f70: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
6f80: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
6f90: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
6fa0: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
6fb0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
6fc0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
6fd0: 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
6fe0: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
6ff0: 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
7000: 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
7010: 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
7020: 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
7030: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
7040: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
7050: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
7060: 70 49 6e 64 65 78 3b 0a 20 20 69 66 28 20 21 70  pIndex;.  if( !p
7070: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
7080: 26 20 21 68 69 64 65 4e 61 6d 65 20 29 7b 0a 20  & !hideName ){. 
7090: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
70a0: 65 72 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68  ert(&db->idxHash
70b0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
70c0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
70d0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
70e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
70f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
7100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7110: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
7120: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
7130: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
7140: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
7150: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
7160: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
7170: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
7180: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
7190: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
71a0: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
71b0: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ber from the pPa
71c0: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65  rse->newTnum fie
71d0: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ld..  */.  if( p
71e0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
71f0: 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  && pTable!=0 ){.
7200: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
7210: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
7220: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
7230: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
7240: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
7250: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
7260: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
7270: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
7280: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
7290: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
72a0: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
72b0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
72c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
72d0: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
72e0: 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46  *.  ** The initF
72f0: 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68  lag is 0 when th
7300: 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
7310: 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
7320: 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
7330: 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  .  The initFlag 
7340: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
7350: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
7360: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
7370: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
7380: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
7390: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
73a0: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
73b0: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
73c0: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
73d0: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
73e0: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
73f0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
7400: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
7410: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
7420: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
7430: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
7440: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
7450: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
7460: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
7470: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
7480: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
7490: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
74a0: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
74b0: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
74c0: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
74d0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
74e0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
74f0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
7500: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
7510: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e  e if( pParse->in
7520: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
7530: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
7540: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
7550: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
7560: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
7570: 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70  ;.    int isTemp
7580: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b   = pTab->isTemp;
7590: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
75a0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
75b0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
75c0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
75d0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
75e0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
75f0: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
7600: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
7610: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ns)==0 ){.      
7620: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7630: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
7640: 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  ion, 0, 0, 0, 0)
7650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7660: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7670: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62  VerifyCookie, db
7680: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
7690: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
76a0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
76b0: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
76c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
76d0: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
76e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
76f0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
7700: 69 74 65 2c 20 30 2c 20 32 2c 20 4d 41 53 54 45  ite, 0, 2, MASTE
7710: 52 5f 4e 41 4d 45 2c 20 30 29 3b 0a 20 20 20 20  R_NAME, 0);.    
7720: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7730: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
7740: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7750: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
7760: 6f 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  o, 0, 0, 0, 0);.
7770: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7780: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
7790: 6e 67 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78  ng, 0, 0, "index
77a0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 0);.      sql
77b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
77c0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
77d0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
77e0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
77f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7800: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 54  String, 0, 0, pT
7810: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
7820: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
7830: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7840: 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
7850: 78 2c 20 30 2c 20 69 73 54 65 6d 70 2c 20 30 2c  x, 0, isTemp, 0,
7860: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
7870: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
7880: 64 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e  ddr, (char*)&pIn
7890: 64 65 78 2d 3e 74 6e 75 6d 2c 20 2d 31 29 3b 0a  dex->tnum, -1);.
78a0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
78b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
78c0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
78d0: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
78e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
78f0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
7900: 41 75 78 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29  Aux, 1, 0, 0, 0)
7910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7930: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
7940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
7950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7960: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
7970: 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 20 30 2c  nWrite, 1, 0, 0,
7980: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7990: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65   }.    if( !isTe
79a0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  mp ){.      addr
79b0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
79c0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
79d0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
79e0: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
79f0: 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
7a00: 20 20 6e 20 3d 20 28 69 6e 74 29 70 45 6e 64 2d    n = (int)pEnd-
7a10: 3e 7a 20 2d 20 28 69 6e 74 29 70 53 74 61 72 74  >z - (int)pStart
7a20: 2d 3e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  ->z + 1;.       
7a30: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7a40: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74  eP3(v, addr, pSt
7a50: 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20  art->z, n);.    
7a60: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7a70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7a80: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
7a90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
7aa0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7ab0: 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20 30 2c 20  , OP_Put, 0, 0, 
7ac0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
7ad0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7ae0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7af0: 64 64 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f  ddOp(v, isTemp ?
7b00: 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50   OP_OpenAux : OP
7b10: 5f 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  _Open, .        
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
7b30: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61   pTab->tnum, pTa
7b40: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
7b50: 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74      lbl1 = sqlit
7b60: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
7b70: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20  );.      lbl2 = 
7b80: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
7b90: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
7ba0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7bb0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 30   OP_Rewind, 2, 0
7bc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
7bd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7be0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
7bf0: 6c 32 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20  l2, 0, lbl1);.  
7c00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7c10: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c  dOp(v, OP_Recno,
7c20: 20 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   2, 0, 0, 0);.  
7c30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7c40: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
7c50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
7c60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7c70: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70   OP_Column, 2, p
7c80: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
7c90: 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  i], 0, 0);.     
7ca0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
7cb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
7cc0: 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65  akeIdxKey, pInde
7cd0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  x->nColumn, 0, 0
7ce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7cf0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7d00: 50 5f 50 75 74 49 64 78 2c 20 31 2c 20 70 49 6e  P_PutIdx, 1, pIn
7d10: 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 2c 20 30  dex->isUnique, 0
7d20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7d30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7d40: 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 2c  P_Goto, 0, lbl1,
7d50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
7d60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7d70: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
7d80: 30 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  0, lbl2);.      
7d90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7da0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20  v, OP_Close, 2, 
7db0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
7dc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7dd0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
7de0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
7df0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
7e00: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
7e10: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
7e20: 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64    changeCookie(d
7e30: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
7e40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7e50: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 64 62 2d  P_SetCookie, db-
7e60: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 2c  >next_cookie, 0,
7e70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
7e80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7e90: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
7ea0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
7eb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 64 62 2d  }.      if( (db-
7ec0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7ed0: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
7ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7ef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
7f00: 6d 69 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  mit, 0, 0, 0, 0)
7f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f20: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
7f30: 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
7f40: 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
7f50: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
7f60: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
7f70: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  st);.  sqliteFre
7f80: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
7f90: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
7fa0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
7fb0: 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
7fc0: 6e 61 6d 65 64 20 69 6e 64 65 78 2e 0a 2a 2f 0a  named index..*/.
7fd0: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
7fe0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
7ff0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8000: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
8010: 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ex;.  char *zNam
8020: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
8030: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
8040: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
8050: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
8060: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
8070: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
8080: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
8090: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
80a0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
80b0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
80c0: 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  n;.  pIndex = sq
80d0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
80e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
80f0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
8100: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
8110: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
8120: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
8130: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
8140: 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a  h index: ", 0, .
8150: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
8160: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
8170: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
8180: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
8190: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
81a0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
81b0: 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
81c0: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
81d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
81e0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
81f0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
8200: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
8210: 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d  Op dropIndex[] =
8220: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70   {.      { OP_Op
8230: 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32 2c 20  enWrite,  0, 2, 
8240: 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d        MASTER_NAM
8250: 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  E},.      { OP_R
8260: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 30 2c  ewind,     0, 0,
8270: 20 20 20 20 20 20 20 30 7d 2c 20 0a 20 20 20 20         0}, .    
8280: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
8290: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
82a0: 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20  }, /* 2 */.     
82b0: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
82c0: 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d    0, ADDR(8), 0}
82d0: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
82e0: 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20  { OP_Dup,       
82f0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
8300: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
8310: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
8320: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
8330: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30  OP_Ne,         0
8340: 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20  , ADDR(3), 0},. 
8350: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
8360: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
8370: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
8380: 5f 44 65 73 74 72 6f 79 2c 20 20 20 20 30 2c 20  _Destroy,    0, 
8390: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
83a0: 38 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  8 */.      { OP_
83b0: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30  SetCookie,  0, 0
83c0: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39  ,       0}, /* 9
83d0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
83e0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c  lose,      0, 0,
83f0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
8400: 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  ;.    int base;.
8410: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8420: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
8430: 3b 0a 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  ;..    if( (db->
8440: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
8450: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
8460: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8470: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
8480: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ction, 0, 0, 0, 
8490: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
84a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
84b0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62  VerifyCookie, db
84c0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
84d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
84e0: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
84f0: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 20  erified = 1;.   
8500: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 54 61 62   }.    if( !pTab
8510: 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ->isTemp ){.    
8520: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
8530: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
8540: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
8550: 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
8560: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8570: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
8580: 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+2, pIndex->zN
8590: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ame, 0);.      c
85a0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b  hangeCookie(db);
85b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
85c0: 65 43 68 61 6e 67 65 50 31 28 76 2c 20 62 61 73  eChangeP1(v, bas
85d0: 65 2b 39 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  e+9, db->next_co
85e0: 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  okie);.    }.   
85f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8600: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
8610: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 54  pIndex->tnum, pT
8620: 61 62 2d 3e 69 73 54 65 6d 70 2c 20 30 2c 20 30  ab->isTemp, 0, 0
8630: 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  );.    if( (db->
8640: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
8650: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
8660: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8670: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
8680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
8690: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
86a0: 61 72 6b 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ark the internal
86b0: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
86c0: 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e 20 62 79   for deletion by
86d0: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
86e0: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
86f0: 61 6e 67 65 73 20 72 6f 75 74 69 6e 65 2e 0a 20  anges routine.. 
8700: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
8710: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
8720: 20 20 70 49 6e 64 65 78 2d 3e 69 73 44 65 6c 65    pIndex->isDele
8730: 74 65 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  te = 1;.    db->
8740: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8750: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
8760: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
8770: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
8780: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
8790: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
87a0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
87b0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
87c0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
87d0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
87e0: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
87f0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
8800: 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70  pend(ExprList *p
8810: 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  List, Expr *pExp
8820: 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  r, Token *pName)
8830: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
8840: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
8850: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
8860: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
8870: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
8880: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
8890: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
88a0: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
88b0: 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  & 7)==0 ){.    i
88c0: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt n = pList->nE
88d0: 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 70 4c 69  xpr + 8;.    pLi
88e0: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
88f0: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
8900: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
8910: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
8920: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20  pList->a==0 ){. 
8930: 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70       pList->nExp
8940: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  r = 0;.      ret
8950: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
8960: 0a 20 20 7d 0a 20 20 69 20 3d 20 70 4c 69 73 74  .  }.  i = pList
8970: 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 70 4c 69  ->nExpr++;.  pLi
8980: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
8990: 20 70 45 78 70 72 3b 0a 20 20 70 4c 69 73 74 2d   pExpr;.  pList-
89a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
89b0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
89c0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
89d0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
89e0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
89f0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
8a00: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f  .    sqliteDequo
8a10: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  te(pList->a[i].z
8a20: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Name);.  }.  ret
8a30: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
8a40: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
8a50: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
8a60: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
8a70: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
8a80: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
8a90: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
8aa0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
8ab0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8ac0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
8ad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
8ae0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  teExprDelete(pLi
8af0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
8b00: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8b10: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
8b20: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
8b30: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
8b40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
8b50: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  st);.}../*.** Ap
8b60: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
8b70: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
8b80: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
8b90: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
8ba0: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
8bb0: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
8bc0: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
8bd0: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
8be0: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
8bf0: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
8c00: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
8c10: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
8c20: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
8c30: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
8c40: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
8c50: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
8c60: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
8c70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8c80: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
8c90: 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a  >nId & 7)==0 ){.
8ca0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
8cb0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
8cc0: 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e  st->a, (pList->n
8cd0: 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69  Id+8)*sizeof(pLi
8ce0: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
8cf0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
8d00: 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
8d10: 3e 6e 49 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  >nId = 0;.      
8d20: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
8d30: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
8d40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8d50: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
8d60: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
8d70: 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Id], 0, sizeof(p
8d80: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
8d90: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
8da0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
8db0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
8dc0: 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  Id].zName;.    s
8dd0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
8de0: 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  pz, pToken->z, p
8df0: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
8e00: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
8e10: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
8e20: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
8e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
8e40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8e50: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
8e60: 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *pz);.    }.  }.
8e70: 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a    pList->nId++;.
8e80: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
8e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
8ea0: 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
8eb0: 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
8ec0: 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
8ed0: 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
8ee0: 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41  id sqliteIdListA
8ef0: 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20 2a  ddAlias(IdList *
8f00: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
8f10: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
8f20: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49 64  st && pList->nId
8f30: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
8f40: 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20 31  = pList->nId - 1
8f50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
8f60: 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61  String(&pList->a
8f70: 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b  [i].zAlias, pTok
8f80: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
8f90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
8fa0: 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61  Dequote(pList->a
8fb0: 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  [i].zAlias);.  }
8fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
8fd0: 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69 73   an entire IdLis
8fe0: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
8ff0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
9000: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
9010: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
9020: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
9030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
9040: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
9050: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
9060: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
9070: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
9080: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
9090: 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  as);.    if( pLi
90a0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
90b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
90c0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
90d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  .zName);.      s
90e0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
90f0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  e(pList->a[i].pS
9100: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
9110: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
9120: 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  0, pList->a[i].p
9130: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
9140: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
9150: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
9160: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
9170: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20  ./*.** The COPY 
9180: 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63  command is for c
9190: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
91a0: 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64  h PostgreSQL and
91b0: 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a   specificially.*
91c0: 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74  * for the abilit
91d0: 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  y to read the ou
91e0: 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e  tput of pg_dump.
91f0: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20    The format is 
9200: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  as.** follows:.*
9210: 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62  *.**    COPY tab
9220: 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53  le FROM file [US
9230: 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73  ING DELIMITERS s
9240: 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61  tring].**.** "ta
9250: 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74  ble" is an exist
9260: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ing table name. 
9270: 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69   We will read li
9280: 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d  nes of code from
9290: 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c  .** file to fill
92a0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68   this table with
92b0: 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67   data.  File mig
92c0: 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20  ht be "stdin".  
92d0: 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20  The optional.** 
92e0: 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67  delimiter string
92f0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
9300: 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73  field separators
9310: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
9320: 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64  s a tab..*/.void
9330: 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50   sqliteCopy(.  P
9340: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9350: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9360: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
9370: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
9380: 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20  ,   /* The name 
9390: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
93a0: 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  o which we will 
93b0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65  insert */.  Toke
93c0: 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20  n *pFilename,   
93d0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
93e0: 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69  m which to obtai
93f0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  n information */
9400: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d  .  Token *pDelim
9410: 69 74 65 72 20 20 20 20 2f 2a 20 55 73 65 20 74  iter    /* Use t
9420: 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64  his as the field
9430: 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29 7b   delimiter */.){
9440: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
9450: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20    char *zTab;.  
9460: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62 65  int i, j;.  Vdbe
9470: 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c   *v;.  int addr,
9480: 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70   end;.  Index *p
9490: 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Idx;.  sqlite *d
94a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
94b0: 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65  .  zTab = sqlite
94c0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
94d0: 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  en(pTableName);.
94e0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
94f0: 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54  loc_failed || zT
9500: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70  ab==0 ) goto cop
9510: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61  y_cleanup;.  pTa
9520: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
9530: 62 6c 65 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20  ble(db, zTab);. 
9540: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62   sqliteFree(zTab
9550: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
9560: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
9570: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
9580: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
9590: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c  uch table: ", 0,
95a0: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65   .        pTable
95b0: 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e  Name->z, pTableN
95c0: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
95d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
95e0: 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c      goto copy_cl
95f0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
9600: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
9610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
9620: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9630: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
9640: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
9650: 20 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f          " may no
9660: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20  t be modified", 
9670: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
9680: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
9690: 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20   copy_cleanup;. 
96a0: 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47   }.  v = sqliteG
96b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
96c0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
96d0: 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 69  nt openOp;.    i
96e0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
96f0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
9700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
9710: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9720: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30  P_Transaction, 0
9730: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
9740: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9750: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
9760: 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61  okie, db->schema
9770: 5f 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30  _cookie, 0, 0, 0
9780: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
9790: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
97a0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 1;.    }.    a
97b0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
97c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
97d0: 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Open, 0, 0, 0, 0
97e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
97f0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
9800: 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c  r, pFilename->z,
9810: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a   pFilename->n);.
9820: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
9830: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
9840: 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70  ;.    openOp = p
9850: 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  Tab->isTemp ? OP
9860: 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f  _OpenWrAux : OP_
9870: 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73  OpenWrite;.    s
9880: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9890: 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61  , openOp, 0, pTa
98a0: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a  b->tnum, pTab->z
98b0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f  Name, 0);.    fo
98c0: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
98d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
98e0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
98f0: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  , i++){.      sq
9900: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9910: 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70 49 64 78   openOp, i, pIdx
9920: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 7a 4e  ->tnum, pIdx->zN
9930: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
9940: 20 20 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56     end = sqliteV
9950: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9960: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
9970: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9980: 50 5f 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62  P_FileRead, pTab
9990: 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 2c 20 30 2c 20  ->nCol, end, 0, 
99a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c  0);.    if( pDel
99b0: 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  imiter ){.      
99c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
99d0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c  P3(v, addr, pDel
99e0: 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69  imiter->z, pDeli
99f0: 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20  miter->n);.     
9a00: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
9a10: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
9a20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9a30: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
9a40: 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22  P3(v, addr, "\t"
9a50: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
9a60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9a70: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
9a80: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
9a90: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
9aa0: 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
9ab0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9ac0: 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Dup, 0, 0, 0, 0
9ad0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
9ae0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
9af0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
9b00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9b10: 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e  v, OP_FileColumn
9b20: 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , i, 0, 0, 0);. 
9b30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
9b40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
9b50: 61 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d  akeRecord, pTab-
9b60: 3e 6e 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  >nCol, 0, 0, 0);
9b70: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
9b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20  ddOp(v, OP_Put, 
9b90: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
9ba0: 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70   for(i=1, pIdx=p
9bb0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
9bc0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9bd0: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
9be0: 20 69 66 28 20 70 49 64 78 2d 3e 70 4e 65 78 74   if( pIdx->pNext
9bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9c00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9c10: 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20  P_Dup, 0, 0, 0, 
9c20: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
9c30: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
9c40: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
9c50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9c60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9c70: 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  FileColumn, pIdx
9c80: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
9c90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
9ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9cb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
9cc0: 65 49 64 78 4b 65 79 2c 20 70 49 64 78 2d 3e 6e  eIdxKey, pIdx->n
9cd0: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29  Column, 0, 0, 0)
9ce0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9cf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
9d00: 74 49 64 78 2c 20 69 2c 20 70 49 64 78 2d 3e 69  tIdx, i, pIdx->i
9d10: 73 55 6e 69 71 75 65 2c 20 30 2c 20 30 29 3b 0a  sUnique, 0, 0);.
9d20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9d30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d40: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2c 20 30  Goto, 0, addr, 0
9d50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9d60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d70: 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65  Noop, 0, 0, 0, e
9d80: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62  nd);.    if( (db
9d90: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9da0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
9db0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9dc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d  AddOp(v, OP_Comm
9dd0: 69 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  it, 0, 0, 0, 0);
9de0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f  .    }.  }.  .co
9df0: 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65  py_cleanup:.  re
9e00: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
9e10: 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  he non-standard 
9e20: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69  VACUUM command i
9e30: 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  s used to clean 
9e40: 75 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  up the database,
9e50: 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65  .** collapse fre
9e60: 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49  e space, etc.  I
9e70: 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66  t is modelled af
9e80: 74 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63  ter the VACUUM c
9e90: 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73  ommand.** in Pos
9ea0: 74 67 72 65 53 51 4c 2e 0a 2a 2f 0a 76 6f 69 64  tgreSQL..*/.void
9eb0: 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61   sqliteVacuum(Pa
9ec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9ed0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b  en *pTableName){
9ee0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
9ef0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
9f00: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
9f10: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
9f20: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9f30: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
9f40: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
9f50: 28 20 70 54 61 62 6c 65 4e 61 6d 65 20 29 7b 0a  ( pTableName ){.
9f60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9f70: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
9f80: 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29  oken(pTableName)
9f90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9fa0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
9fb0: 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  if( zName && sql
9fc0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
9fd0: 20 7a 4e 61 6d 65 29 3d 3d 30 0a 20 20 20 20 26   zName)==0.    &
9fe0: 26 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  & sqliteFindTabl
9ff0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  e(db, zName)==0 
a000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
a010: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
a020: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
a030: 68 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  h table or index
a040: 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  : ", zName, 0);.
a050: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
a060: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 76 61 63  ++;.    goto vac
a070: 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  uum_cleanup;.  }
a080: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
a090: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a0a0: 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
a0b0: 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a  vacuum_cleanup;.
a0c0: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
a0d0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
a0e0: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)==0 ){.    sql
a0f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a100: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
a110: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
a120: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a130: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
a140: 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f  kie, db->schema_
a150: 63 6f 6f 6b 69 65 2c 20 30 2c 20 30 2c 20 30 29  cookie, 0, 0, 0)
a160: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63  ;.    pParse->sc
a170: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
a180: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
a190: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
a1a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
a1b0: 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c  eorganize, 0, 0,
a1c0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 65   zName, 0);.  }e
a1d0: 6c 73 65 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  lse{.    Table *
a1e0: 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78 20  pTab;.    Index 
a1f0: 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73 68 45  *pIdx;.    HashE
a200: 6c 65 6d 20 2a 70 45 3b 0a 20 20 20 20 66 6f 72  lem *pE;.    for
a210: 28 70 45 3d 73 71 6c 69 74 65 48 61 73 68 46 69  (pE=sqliteHashFi
a220: 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68  rst(&db->tblHash
a230: 29 3b 20 70 45 3b 20 70 45 3d 73 71 6c 69 74 65  ); pE; pE=sqlite
a240: 48 61 73 68 4e 65 78 74 28 70 45 29 29 7b 0a 20  HashNext(pE)){. 
a250: 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
a260: 74 65 48 61 73 68 44 61 74 61 28 70 45 29 3b 0a  teHashData(pE);.
a270: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a280: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72  AddOp(v, OP_Reor
a290: 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 70 54  ganize, 0, 0, pT
a2a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
a2b0: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
a2c0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
a2d0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
a2e0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt){.        sql
a2f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a300: 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30  OP_Reorganize, 0
a310: 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  , 0, pIdx->zName
a320: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
a330: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 64    }.  }.  if( (d
a340: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
a350: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
a360: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
a370: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
a380: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  t, 0, 0, 0, 0);.
a390: 20 20 7d 0a 0a 76 61 63 75 75 6d 5f 63 6c 65 61    }..vacuum_clea
a3a0: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nup:.  sqliteFre
a3b0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
a3c0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rn;.}../*.** Beg
a3d0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
a3e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
a3f0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
a400: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
a410: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
a420: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
a430: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
a440: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
a450: 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20  || db->pBe==0 ) 
a460: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
a470: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
a480: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
a490: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
a4a0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
a4b0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 20  QLITE_InTrans ) 
a4c0: 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71  return;.  v = sq
a4d0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
a4e0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
a4f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a500: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
a510: 63 74 69 6f 6e 2c 20 31 2c 20 30 2c 20 30 2c 20  ction, 1, 0, 0, 
a520: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
a530: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
a540: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e  rifyCookie, db->
a550: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
a560: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
a570: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
a580: 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 64  ied = 1;.  }.  d
a590: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
a5a0: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f  TE_InTrans;.}../
a5b0: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
a5c0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
a5d0: 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72  d sqliteCommitTr
a5e0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
a5f0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
a600: 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
a610: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
a620: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
a630: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
a640: 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  >pBe==0 ) return
a650: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
a660: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
a670: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
a680: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
a690: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
a6a0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72  _InTrans)==0 ) r
a6b0: 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c  eturn;.  v = sql
a6c0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
a6d0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
a6e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a6f0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
a700: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
a710: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
a720: 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
a730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
a740: 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
a750: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
a760: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
a770: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
a780: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
a790: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
a7a0: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
a7b0: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
a7c0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
a7d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
a7e0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
a7f0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
a800: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
a810: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
a820: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
a830: 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ns)==0 ) return;
a840: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
a850: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a860: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
a870: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a880: 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20  OP_Rollback, 0, 
a890: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
a8a0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
a8b0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a  LITE_InTrans;.}.
a8c0: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
a8d0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
a8e0: 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g as a boolean v
a8f0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
a900: 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63  int getBoolean(c
a910: 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69  har *z){.  stati
a920: 63 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d  c char *azTrue[]
a930: 20 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22   = { "yes", "on"
a940: 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e  , "true" };.  in
a950: 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d  t i;.  if( z[0]=
a960: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a970: 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30   if( isdigit(z[0
a980: 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27  ]) || (z[0]=='-'
a990: 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d   && isdigit(z[1]
a9a0: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
a9b0: 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20   atoi(z);.  }.  
a9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
a9d0: 66 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66  f(azTrue)/sizeof
a9e0: 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b  (azTrue[0]); i++
a9f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
aa00: 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75  eStrICmp(z,azTru
aa10: 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  e[i])==0 ) retur
aa20: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
aa30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
aa40: 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73  ocess a pragma s
aa50: 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  tatement.  .**.*
aa60: 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66  * Pragmas are of
aa70: 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a   this form:.**.*
aa80: 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64  *      PRAGMA id
aa90: 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54   = value.**.** T
aaa0: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69  he identifier mi
aab0: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74  ght also be a st
aac0: 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65  ring.  The value
aad0: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e   is a string, an
aae0: 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c  d.** identifier,
aaf0: 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49   or a number.  I
ab00: 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74  f minusFlag is t
ab10: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61  rue, then the va
ab20: 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62  lue is.** a numb
ab30: 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63  er that was prec
ab40: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
ab50: 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sign..*/.void sq
ab60: 6c 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65  litePragma(Parse
ab70: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
ab80: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
ab90: 52 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73  Right, int minus
aba0: 46 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Flag){.  char *z
abb0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Left = 0;.  char
abc0: 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *zRight = 0;.  
abd0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
abe0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66  rse->db;..  zLef
abf0: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
ac00: 70 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66  p(pLeft->z, pLef
ac10: 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  t->n);.  sqliteD
ac20: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
ac30: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
ac40: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30  {.    zRight = 0
ac50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
ac60: 53 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20  String(&zRight, 
ac70: 22 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e  "-", 1, pRight->
ac80: 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29  z, pRight->n, 0)
ac90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
aca0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74  Right = sqliteSt
acb0: 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c  rNDup(pRight->z,
acc0: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20   pRight->n);.   
acd0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
ace0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20  Right);.  }. .  
acf0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ad00: 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73  p(zLeft,"cache_s
ad10: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
ad20: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
ad30: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  zRight);.    sql
ad40: 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
ad50: 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 73 69  Size(db->pBe, si
ad60: 7a 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ze);.  }else..  
ad70: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ad80: 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74  p(zLeft, "vdbe_t
ad90: 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
ada0: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
adb0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
adc0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
add0: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a  LITE_VdbeTrace;.
ade0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
adf0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
ae00: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
ae10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
ae20: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
ae30: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c  Cmp(zLeft, "full
ae40: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d  _column_names")=
ae50: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
ae60: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
ae70: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
ae80: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75  ags |= SQLITE_Fu
ae90: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  llColNames;.    
aea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
aeb0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
aec0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
aed0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
aee0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
aef0: 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65  mp(zLeft, "table
af00: 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  _info")==0 ){.  
af10: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
af20: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
af30: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
af40: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
af50: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  t);.    if( pTab
af60: 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74   ) v = sqliteGet
af70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
af80: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 76 20    if( pTab && v 
af90: 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
afa0: 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f  VdbeOp tableInfo
afb0: 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
afc0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
afd0: 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c 20 20 20  nCount, 5, 0,   
afe0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20      0},.        
aff0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
b000: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 63    0, 0,       "c
b010: 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  id"},.        { 
b020: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
b030: 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
b040: 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
b050: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
b060: 2c 20 30 2c 20 20 20 20 20 20 20 22 74 79 70 65  , 0,       "type
b070: 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
b080: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 33 2c  _ColumnName,  3,
b090: 20 30 2c 20 20 20 20 20 20 20 22 6e 6f 74 6e 75   0,       "notnu
b0a0: 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  ll"},.        { 
b0b0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
b0c0: 34 2c 20 30 2c 20 20 20 20 20 20 20 22 64 66 6c  4, 0,       "dfl
b0d0: 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20 20 20 20  t_value"},.     
b0e0: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
b0f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b100: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
b110: 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66  raySize(tableInf
b120: 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65  oPreface), table
b130: 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20  InfoPreface);.  
b140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b150: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
b160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b170: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b180: 6e 74 65 67 65 72 2c 20 69 2c 20 30 2c 20 30 2c  nteger, i, 0, 0,
b190: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
b1a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b1b0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
b1c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
b1d0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
b1e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b1f0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
b200: 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
b210: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
b220: 7a 54 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43  zType ? pTab->aC
b230: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 74  ol[i].zType : "t
b240: 65 78 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ext", 0);.      
b250: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b260: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b270: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
b280: 6f 74 4e 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 29  otNull, 0, 0, 0)
b290: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b2a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b2b0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 54  String, 0, 0, pT
b2c0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  ab->aCol[i].zDfl
b2d0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
b2e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b2f0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35  , OP_Callback, 5
b300: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b320: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
b330: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69  trICmp(zLeft, "i
b340: 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29  ndex_info")==0 )
b350: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
b360: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
b370: 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
b380: 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69  .    pIdx = sqli
b390: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
b3a0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
b3b0: 20 70 49 64 78 20 29 20 76 20 3d 20 73 71 6c 69   pIdx ) v = sqli
b3c0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
b3d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
b3e0: 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
b3f0: 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
b400: 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
b410: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
b420: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20  ColumnCount, 3, 
b430: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
b440: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b450: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
b460: 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20     "seqno"},.   
b470: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
b480: 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20  Name,  1, 0,    
b490: 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
b4a0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
b4b0: 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
b4c0: 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
b4d0: 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  };.      int i;.
b4e0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64        pTab = pId
b4f0: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  x->pTable;.     
b500: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b510: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
b520: 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  e(tableInfoPrefa
b530: 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72  ce), tableInfoPr
b540: 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66 6f  eface);.      fo
b550: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
b560: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
b570: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b580: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b590: 67 65 72 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29  ger, i, 0, 0, 0)
b5a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b5b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b5c0: 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 61  Integer, pIdx->a
b5d0: 69 43 6f 6c 75 6d 6e 5b 69 5d 2c 20 30 2c 20 30  iColumn[i], 0, 0
b5e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
b5f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b600: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
b610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
b620: 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
b630: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
b640: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
b650: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b660: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33  , OP_Callback, 3
b670: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b680: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b690: 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e..#ifndef NDEBU
b6a0: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  G.  if( sqliteSt
b6b0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61  rICmp(zLeft, "pa
b6c0: 72 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20  rser_trace")==0 
b6d0: 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
b6e0: 69 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54  id sqliteParserT
b6f0: 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72  race(FILE*, char
b700: 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74   *);.    if( get
b710: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
b720: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  ){.      sqliteP
b730: 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75  arserTrace(stdou
b740: 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a  t, "parser: ");.
b750: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b760: 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
b770: 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ce(0, 0);.    }.
b780: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
b790: 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72 65    {}.  sqliteFre
b7a0: 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  e(zLeft);.  sqli
b7b0: 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a  teFree(zRight);.
b7c0: 7d 0a                                            }.