/ Hex Artifact Content
Login

Artifact c5023252c4d0ed19067f2118639b8d9f14f3f91a:


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 36 37 20 32 30 30  ild.c,v 1.67 200
0320: 32 2f 30 31 2f 32 39 20 31 38 3a 34 31 3a 32 35  2/01/29 18:41:25
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0820: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0830: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0840: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0850: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
0860: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
0870: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0880: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0890: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
08a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
08b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
08c0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
08d0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
08e0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
08f0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0900: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0910: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0920: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0930: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0940: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0950: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0960: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0970: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0980: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  eExprDelete(pLef
0990: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  t);.    sqliteEx
09a0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
09b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
09c0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
09d0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
09e0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
09f0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
0a00: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
0a10: 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  n ){.    pNew->t
0a20: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
0a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0a40: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b  w->token.z = "";
0a50: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0a60: 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .n = 0;.  }.  if
0a70: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
0a80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  t ){.    sqliteE
0a90: 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70  xprSpan(pNew, &p
0aa0: 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69  Left->span, &pRi
0ab0: 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65  ght->span);.  }e
0ac0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  lse{.    pNew->s
0ad0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
0ae0: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
0af0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pNew;.}../*.** S
0b00: 65 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  et the Expr.toke
0b10: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
0b20: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
0b30: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
0b40: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
0b50: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
0b60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0b70: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
0b80: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
0b90: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
0ba0: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  t){.  if( pExpr 
0bb0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
0bc0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
0bd0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e  .    pExpr->span
0be0: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
0bf0: 20 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29   Addr(pRight->z)
0c00: 20 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a   - Addr(pLeft->z
0c10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0c20: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
0c30: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
0c40: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
0c50: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
0c60: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
0c70: 70 72 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75  pr *sqliteExprFu
0c80: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
0c90: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
0ca0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
0cb0: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
0cc0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0cd0: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
0ce0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0cf0: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
0d00: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
0d10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
0d20: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0d30: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
0d40: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
0d50: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
0d60: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
0d70: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
0d80: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
0d90: 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20  token.z = "";.  
0da0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20    pNew->token.n 
0db0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0dc0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0dd0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
0de0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
0df0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
0e00: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
0e10: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
0e20: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
0e30: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 20   of that table. 
0e40: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0e50: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54 61  not found..*/.Ta
0e60: 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64 54  ble *sqliteFindT
0e70: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
0e80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0e90: 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c 69   Table *p = sqli
0ea0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
0eb0: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
0ec0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
0ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
0ee0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
0ef0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
0f00: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
0f10: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
0f20: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
0f30: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
0f40: 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  at index..** Ret
0f50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0f60: 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  found..*/.Index 
0f70: 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78  *sqliteFindIndex
0f80: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61  (sqlite *db, cha
0f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  r *zName){.  Ind
0fa0: 65 78 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61  ex *p = sqliteHa
0fb0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0fc0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0fd0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0fe0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0ff0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1000: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1010: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1020: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1030: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1040: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1050: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1060: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1070: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1080: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1090: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
10a0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
10b0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
10c0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
10d0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
10e0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
10f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1100: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1110: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
1120: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
1130: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
1140: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
1150: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
1160: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
1170: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1180: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
1190: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
11a0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
11b0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
11c0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
11d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
11e0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
11f0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
1200: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
1210: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
1220: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1230: 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 2c 20 70  (&db->idxDrop, p
1240: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1250: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1260: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
1270: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  ven index from i
1280: 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ts table, then r
1290: 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64  emove.** the ind
12a0: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
12b0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
12c0: 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79   free its memory
12d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a  .** structures..
12e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e  */.void sqliteUn
12f0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
1300: 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49  ex(sqlite *db, I
1310: 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
1320: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
1330: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
1340: 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  dex ){.    pInde
1350: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1360: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
1370: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1380: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f  Index *p;.    fo
1390: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
13a0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
13b0: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
13c0: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
13d0: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d  .    if( p && p-
13e0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
13f0: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
1400: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1420: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1430: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  db, pIndex);.}..
1440: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67  /*.** Move the g
1450: 69 76 65 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  iven index to th
1460: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 49  e pending DROP I
1470: 4e 44 45 58 20 71 75 65 75 65 20 69 66 20 69 74  NDEX queue if it
1480: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d   has.** been com
1490: 6d 69 74 74 65 64 2e 20 20 49 66 20 74 68 69 73  mitted.  If this
14a0: 20 69 6e 64 65 78 20 77 61 73 20 6e 65 76 65 72   index was never
14b0: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14c0: 20 6a 75 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20   just.** delete 
14d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  it..**.** Indice
14e0: 73 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  s on the pending
14f0: 20 64 72 6f 70 20 71 75 65 75 65 20 61 72 65 20   drop queue are 
1500: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 61 20 43  deleted when a C
1510: 4f 4d 4d 49 54 20 69 73 0a 2a 2a 20 65 78 65 63  OMMIT is.** exec
1520: 75 74 65 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c  uted.  If a ROLL
1530: 42 41 43 4b 20 6f 63 63 75 72 73 2c 20 74 68 65  BACK occurs, the
1540: 20 69 6e 64 69 63 65 73 20 61 72 65 20 6d 6f 76   indices are mov
1550: 65 64 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20  ed back into.** 
1560: 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 20 68  the main index h
1570: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ash table..*/.st
1580: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1590: 50 65 6e 64 69 6e 67 44 72 6f 70 49 6e 64 65 78  PendingDropIndex
15a0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
15b0: 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70  ex *p){.  if( !p
15c0: 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ->isCommit ){.  
15d0: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
15e0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
15f0: 20 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   p);.  }else{.  
1600: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20    Index *pOld;. 
1610: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
1620: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1630: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
1640: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
1650: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 20 20 69  me)+1, 0);.    i
1660: 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f  f( pOld!=0 && pO
1670: 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ld!=p ){.      s
1680: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1690: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 4f  &db->idxHash, pO
16a0: 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ld->zName, strle
16b0: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
16c0: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
16d0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
16e0: 65 72 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ert(&db->idxDrop
16f0: 2c 20 70 2c 20 30 2c 20 70 29 3b 0a 20 20 20 20  , p, 0, p);.    
1700: 70 2d 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 31  p->isDropped = 1
1710: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1720: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
1730: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
1740: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1750: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
1760: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
1770: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
1780: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
1790: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
17a0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
17b0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
17c0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
17d0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
17e0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
17f0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
1800: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
1810: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
1820: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
1830: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
1840: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1850: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 2e 0a  with the table..
1860: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
1870: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1880: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
1890: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
18a0: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
18b0: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
18c0: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
18d0: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
18e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
18f0: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
1900: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
1910: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
1920: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
1930: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1940: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  teDeleteTable(sq
1950: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
1960: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
1970: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
1980: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  ex, *pNext;.  if
1990: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
19a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
19b0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
19c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
19d0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
19e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
19f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1a00: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
1a10: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
1a20: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1a30: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
1a40: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
1a50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
1a60: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
1a70: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
1a80: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1a90: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1aa0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1ab0: 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
1ac0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
1ad0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
1ae0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
1af0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
1b00: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
1b10: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1b20: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
1b30: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
1b40: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
1b50: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
1b60: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
1b70: 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndices..*/.stati
1b80: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  c void sqliteUnl
1b90: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
1ba0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
1bb0: 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65  ble *p){.  Table
1bc0: 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74   *pOld;.  assert
1bd0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
1be0: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1bf0: 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  sert(&db->tblHas
1c00: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
1c10: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
1c20: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
1c30: 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d  Old==0 || pOld==
1c40: 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73  p );.  sqliteHas
1c50: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
1c60: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
1c70: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
1c80: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ble(db, p);.}../
1c90: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69  *.** Move the gi
1ca0: 76 65 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65  ven table to the
1cb0: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41   pending DROP TA
1cc0: 42 4c 45 20 71 75 65 75 65 20 69 66 20 69 74 20  BLE queue if it 
1cd0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d  has.** been comm
1ce0: 69 74 74 65 64 2e 20 20 49 66 20 74 68 69 73 20  itted.  If this 
1cf0: 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20  table was never 
1d00: 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1d10: 6a 75 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69  just.** delete i
1d20: 74 2e 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20  t.  Do the same 
1d30: 66 6f 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  for all its indi
1d40: 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65  ces..**.** Table
1d50: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1d60: 75 65 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61  ue are not actua
1d70: 6c 6c 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69  lly deleted unti
1d80: 6c 20 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74  l a COMMIT.** st
1d90: 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75  atement is execu
1da0: 74 65 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42  ted.  If a ROLLB
1db0: 41 43 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65  ACK occurs inste
1dc0: 61 64 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a  ad of a COMMIT,.
1dd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  ** then the tabl
1de0: 65 73 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71  es on the drop q
1df0: 75 65 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62  ueue are moved b
1e00: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ack into the mai
1e10: 6e 0a 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e  n.** hash table.
1e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e30: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
1e40: 70 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64  pTable(sqlite *d
1e50: 62 2c 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b  b, Table *pTbl){
1e60: 0a 20 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73  .  if( !pTbl->is
1e70: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
1e80: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
1e90: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62  eteTable(db, pTb
1ea0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
1eb0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
1ec0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
1ed0: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c   *pNext;.    pOl
1ee0: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1ef0: 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  sert(&db->tblHas
1f00: 68 2c 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20  h, pTbl->zName, 
1f10: 73 74 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61  strlen(pTbl->zNa
1f20: 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73  me)+1,0);.    as
1f30: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c  sert( pOld==pTbl
1f40: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61   );.    sqliteHa
1f50: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62  shInsert(&db->tb
1f60: 6c 44 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20  lDrop, pTbl, 0, 
1f70: 70 54 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70  pTbl);.    for(p
1f80: 49 6e 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49  Index = pTbl->pI
1f90: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
1fa0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
1fb0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
1fc0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
1fd0: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
1fe0: 70 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  pIndex(db, pInde
1ff0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  x);.    }.  }.}.
2000: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c  ./*.** Check all
2010: 20 54 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65   Tables and Inde
2020: 78 65 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72  xes in the inter
2030: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61  nal hash table a
2040: 6e 64 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79  nd commit.** any
2050: 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65   additions or de
2060: 6c 65 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65  letions to those
2070: 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a   hash tables..**
2080: 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69  .** When executi
2090: 6e 67 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ng CREATE TABLE 
20a0: 61 6e 64 20 43 52 45 41 54 45 20 49 4e 44 45 58  and CREATE INDEX
20b0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65   statements, the
20c0: 20 54 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e   Table.** and In
20d0: 64 65 78 20 73 74 72 75 63 74 75 72 65 73 20 61  dex structures a
20e0: 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  re created and a
20f0: 64 64 65 64 20 74 6f 20 74 68 65 20 68 61 73 68  dded to the hash
2100: 20 74 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20   tables, but.** 
2110: 74 68 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66  the "isCommit" f
2120: 69 65 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e  ield is not set.
2130: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
2140: 65 74 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ets those fields
2150: 2e 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74  ..** When execut
2160: 69 6e 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61  ing DROP TABLE a
2170: 6e 64 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74  nd DROP INDEX, t
2180: 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
2190: 78 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  x structures.** 
21a0: 61 72 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66  are moved out of
21b0: 20 74 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78   tblHash and idx
21c0: 48 61 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f  Hash into tblDro
21d0: 70 20 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20  p and idxDrop.  
21e0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
21f0: 64 65 6c 65 74 65 73 20 74 68 65 20 73 74 72 75  deletes the stru
2200: 63 74 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70  cture in tblDrop
2210: 20 61 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a   and idxDrop..**
2220: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
2230: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
2240: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f  rnalChanges().*/
2250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
2260: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2270: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2280: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
2290: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
22a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
22b0: 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20  rnChanges)==0 ) 
22c0: 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63  return;.  db->sc
22d0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62  hema_cookie = db
22e0: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20  ->next_cookie;. 
22f0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2300: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
2310: 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  tblHash); pElem;
2320: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2330: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2340: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2350: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2360: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54  a(pElem);.    pT
2370: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d  able->isCommit =
2380: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45   1;.  }.  for(pE
2390: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23a0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
23b0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
23c0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
23d0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
23e0: 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  e *pTable = sqli
23f0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
2410: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
2420: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
2430: 74 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  teHashClear(&db-
2440: 3e 74 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72  >tblDrop);.  for
2450: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2460: 68 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48  hFirst(&db->idxH
2470: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
2480: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2490: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
24a0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73  ndex *pIndex = s
24b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
24c0: 6c 65 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  lem);.    pIndex
24d0: 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  ->isCommit = 1;.
24e0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45    }.  while( (pE
24f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2500: 72 73 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  rst(&db->idxDrop
2510: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  ))!=0 ){.    Ind
2520: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2530: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2540: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
2550: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2560: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2570: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2580: 43 6c 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72  Clear(&db->idxDr
2590: 6f 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  op);.  db->flags
25a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
25b0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
25c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25d0: 20 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f   runs when one o
25e0: 72 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41  r more CREATE TA
25f0: 42 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45  BLE, CREATE INDE
2600: 58 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45  X,.** DROP TABLE
2610: 2c 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20  , or DROP INDEX 
2620: 73 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20  statements gets 
2630: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68  rolled back.  Th
2640: 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f  e.** additions o
2650: 72 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54  r deletions of T
2660: 61 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73  able and Index s
2670: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
2680: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
2690: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64  h tables are und
26a0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  one..**.** See a
26b0: 6c 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69  lso: sqliteCommi
26c0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
26d0: 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ().*/.void sqlit
26e0: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
26f0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2700: 2a 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44  *db){.  Hash toD
2710: 65 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65  elete;.  HashEle
2720: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20  m *pElem;.  if( 
2730: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2740: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2750: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
2760: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
2770: 28 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49  (&toDelete, SQLI
2780: 54 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c  TE_HASH_POINTER,
2790: 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f   0);.  db->next_
27a0: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
27b0: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f  ema_cookie;.  fo
27c0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
27e0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
27f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2800: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2810: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20  Table *pTable = 
2820: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2830: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21  Elem);.    if( !
2840: 70 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74  pTable->isCommit
2850: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2860: 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65  HashInsert(&toDe
2870: 6c 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c  lete, pTable, 0,
2880: 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a   pTable);.    }.
2890: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
28a0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
28b0: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
28c0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
28d0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
28e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
28f0: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
2900: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2910: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2920: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2930: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
2940: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
2950: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
2960: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2970: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72  First(&db->tblDr
2980: 6f 70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  op); pElem; pEle
2990: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
29a0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
29b0: 62 6c 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20  ble *pOld, *p = 
29c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
29d0: 45 6c 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72  Elem);.    asser
29e0: 74 28 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  t( p->isCommit )
29f0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
2a00: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
2a10: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
2a20: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
2a30: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
2a40: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
2a50: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
2a60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2a70: 43 6c 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72  Clear(&db->tblDr
2a80: 6f 70 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  op);.  for(pElem
2a90: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2aa0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20  (&db->idxHash); 
2ab0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2ac0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2ad0: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
2ae0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48  pIndex = sqliteH
2af0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2b00: 20 20 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d      if( !pIndex-
2b10: 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  >isCommit ){.   
2b20: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2b30: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
2b40: 49 6e 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78  Index, 0, pIndex
2b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
2b60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2b70: 61 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65  ashFirst(&toDele
2b80: 74 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  te); pElem; pEle
2b90: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2ba0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
2bb0: 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  dex *pIndex = sq
2bc0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2bd0: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55  em);.    sqliteU
2be0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2bf0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
2c00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
2c10: 68 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65  hClear(&toDelete
2c20: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2c30: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2c40: 64 62 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45  db->idxDrop); pE
2c50: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2c60: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2c70: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  ){.    Index *pO
2c80: 6c 64 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48  ld, *p = sqliteH
2c90: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2cb0: 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70  sCommit );.    p
2cc0: 2d 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b  ->isDropped = 0;
2cd0: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
2ce0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2cf0: 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->idxHash, p->zN
2d00: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
2d10: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
2d20: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2d30: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
2d40: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2d50: 6c 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f  lear(&db->idxDro
2d60: 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  p);.  db->flags 
2d70: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2d80: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2d90: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
2da0: 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20   name of a user 
2db0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
2dc0: 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a  rom a token..**.
2dd0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
2de0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74   the name is obt
2df0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2e00: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
2e10: 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  st.** be freed b
2e20: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2e30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
2e40: 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65  *sqliteTableName
2e50: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
2e60: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
2e70: 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  *zName = sqliteS
2e80: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
2e90: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71   pName->n);.  sq
2ea0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d  liteDequote(zNam
2eb0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61  e);.  return zNa
2ec0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  me;.}../*.** Beg
2ed0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
2ee0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
2ef0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
2f00: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
2f10: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
2f20: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
2f30: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
2f40: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
2f50: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
2f60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2f70: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
2f80: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
2f90: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
2fa0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
2fb0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
2fc0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
2fd0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a  ble name.  The.*
2fe0: 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69  * pStart token i
2ff0: 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64  s the CREATE and
3000: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61   pName is the ta
3010: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
3020: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
3030: 20 74 72 75 65 20 69 66 20 74 68 65 20 22 54 45   true if the "TE
3040: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
3050: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
3060: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
3070: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
3080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
3090: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
30a0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
30b0: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
30c0: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
30d0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
30e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
30f0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
3100: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
3110: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
3120: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
3130: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
3140: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
3150: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
3160: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3170: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
3180: 74 68 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62  the sqliteEndTab
3190: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
31a0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
31b0: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
31c0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
31d0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
31e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74  */.void sqliteSt
31f0: 61 72 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a  artTable(Parse *
3200: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3210: 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Start, Token *pN
3220: 61 6d 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29  ame, int isTemp)
3230: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
3240: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
3250: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
3260: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
3270: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
3280: 62 65 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65  be *v;..  pParse
3290: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20  ->sFirstToken = 
32a0: 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65  *pStart;.  zName
32b0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
32c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
32d0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
32e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
32f0: 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67  /* Before trying
3300: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d   to create a tem
3310: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61  porary table, ma
3320: 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65  ke sure the Btre
3330: 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69  e for.  ** holdi
3340: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
3350: 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a  les is open..  *
3360: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  /.  if( isTemp &
3370: 26 20 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30  & db->pBeTemp==0
3380: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
3390: 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e   sqliteBtreeOpen
33a0: 28 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53  (0, 0, MAX_PAGES
33b0: 2c 20 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b  , &db->pBeTemp);
33c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
33d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33e0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
33f0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3400: 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  g, "unable to op
3410: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
3420: 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
3430: 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
3440: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
3450: 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20  bles", 0);.     
3460: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
3490: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
34a0: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  InTrans ){.     
34b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
34c0: 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
34d0: 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  pBeTemp);.      
34e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
3500: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
3510: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3520: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
3530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
3540: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
3550: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 62 61 73  temporary datbas
3560: 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20  e file", 0);.   
3570: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
3580: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
3590: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
35a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
35b0: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
35c0: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
35d0: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
35e0: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
35f0: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
3600: 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20  name.  Issue an 
3610: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
3620: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20   it does..  **. 
3630: 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65   ** If we are re
3640: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c  -reading the sql
3650: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3660: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63   because of a sc
3670: 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65  hema.  ** change
3680: 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61   and a new perma
3690: 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f  nent table is fo
36a0: 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63  und whose name c
36b0: 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a  ollides with.  *
36c0: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65  * an existing te
36d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
36e0: 68 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e  hen ignore the n
36f0: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
3700: 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  le..  ** We will
3710: 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e   continue parsin
3720: 67 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73  g, but the pPars
3730: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61  e->nameClash fla
3740: 67 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20  g will be set.  
3750: 2a 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  ** so we will kn
3760: 6f 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68  ow to discard th
3770: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f  e table record o
3780: 6e 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20  nce parsing has 
3790: 66 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20  finished..  */. 
37a0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
37b0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
37c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
37d0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  le!=0 ){.    if(
37e0: 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20   pTable->isTemp 
37f0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
3800: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61  lag ){.      pPa
3810: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d  rse->nameClash =
3820: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
3830: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
3840: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3850: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
3860: 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  , 0, pName->z, p
3870: 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Name->n,.       
3880: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
3890: 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sts", 0, 0);.   
38a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
38b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ame);.      pPar
38c0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
38d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
38e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
38f0: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d  rse->nameClash =
3900: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
3910: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
3920: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
3930: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
3940: 20 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65    (!pIdx->pTable
3950: 2d 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61  ->isTemp || !pPa
3960: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29  rse->initFlag) )
3970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
3980: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3990: 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69  ErrMsg, "there i
39a0: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
39b0: 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20  ex named ", .   
39c0: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
39d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
39e0: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
39f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
3a00: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
3a10: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
3a20: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
3a30: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
3a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3a50: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3a60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3a70: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
3a80: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
3a90: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
3aa0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
3ab0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
3ac0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
3ad0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
3ae0: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73  ble->isTemp = is
3af0: 54 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72  Temp;.  if( pPar
3b00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
3b10: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
3b20: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
3b30: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
3b40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
3b50: 70 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 21 70  pTable;.  if( !p
3b60: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
3b70: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65  && (v = sqliteGe
3b80: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
3b90: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 28 64 62  0 ){.    if( (db
3ba0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3bb0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
3bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3bd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
3be0: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
3bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3c00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
3c10: 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63  fyCookie, db->sc
3c20: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  hema_cookie, 0);
3c30: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73  .      pParse->s
3c40: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20  chemaVerified = 
3c50: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
3c60: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
3c70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3c80: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
3c90: 65 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e, db->file_form
3ca0: 61 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  at, 1);.      sq
3cb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3cc0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
3cd0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
3ce0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3cf0: 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  , -1, MASTER_NAM
3d00: 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  E, P3_STATIC);. 
3d10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3d20: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
3d30: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
3d40: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3d50: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
3d60: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3d70: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3d80: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
3d90: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
3da0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
3db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3dc0: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3dd0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3de0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3df0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3e00: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
3e10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
3e20: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
3e30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
3e40: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
3e50: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3e60: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3e70: 70 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  p;.  char **pz;.
3e80: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3e90: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3eb0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
3ec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
3ed0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
3ee0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
3ef0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
3f00: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
3f10: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
3f20: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
3f30: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
3f40: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
3f50: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 6f 6c   memset(&p->aCol
3f60: 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69  [p->nCol], 0, si
3f70: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
3f80: 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  );.  pz = &p->aC
3f90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e  ol[p->nCol++].zN
3fa0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  ame;.  sqliteSet
3fb0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e 61 6d  NString(pz, pNam
3fc0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3fd0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  0);.  sqliteDequ
3fe0: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
3ff0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4000: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4010: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4020: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4030: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4040: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4050: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
4060: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
4070: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
4080: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
4090: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
40a0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
40b0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
40c0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
40d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
40e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e  .void sqliteAddN
40f0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
4100: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
4110: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
4120: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
4130: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4140: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4150: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
4160: 6c 2d 31 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  l-1;.  if( onErr
4170: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
4180: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
4190: 6f 72 74 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  ort;.  if( i>=0 
41a0: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
41b0: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
41c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
41d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
41e0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
41f0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
4200: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
4210: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4220: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
4230: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
4240: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
4250: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
4260: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
4270: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
4280: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
4290: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
42a0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
42b0: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
42c0: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
42d0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
42e0: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
42f0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
4300: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
4310: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
4320: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
4330: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
4340: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
4350: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
4360: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
4370: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
4380: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46  Parse, Token *pF
4390: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61  irst, Token *pLa
43a0: 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  st){.  Table *p;
43b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
43c0: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c  nt n;.  char *z,
43d0: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
43e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
43f0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4400: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4410: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4420: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4430: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b  ->aCol[i].zType;
4440: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
4450: 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29  + Addr(pLast->z)
4460: 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e   - Addr(pFirst->
4470: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e  z);.  sqliteSetN
4480: 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73  String(pz, pFirs
4490: 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a  t->z, n, 0);.  z
44a0: 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d   = *pz;.  if( z=
44b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
44c0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
44d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
44e0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
44f0: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
4500: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
4510: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
4520: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
4530: 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20  The given token 
4540: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
4550: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73  alue for the las
4560: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
4570: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63  o.** the table c
4580: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
4590: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  onstruction.  If
45a0: 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20   "minusFlag" is 
45b0: 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  true, it.** mean
45c0: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65  s the value toke
45d0: 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  n was preceded b
45e0: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
45f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4600: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4610: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4620: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4630: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4640: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4650: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
4660: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
4670: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
4680: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
4690: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
46a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
46b0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70  nt i;.  char **p
46c0: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
46d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
46e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
46f0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4700: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
4710: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
4720: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69  ol[i].zDflt;.  i
4730: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
4740: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4750: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
4760: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
4770: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
4780: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4790: 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a  ring(pz, pVal->z
47a0: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
47b0: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f   }.  sqliteDequo
47c0: 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  te(*pz);.}../*.*
47d0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
47e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
47f0: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
4800: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
4810: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
4820: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
4830: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
4840: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
4850: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
4860: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
4870: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
4880: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
4890: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
48a0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
48b0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
48c0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
48d0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
48e0: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
48f0: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
4900: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
4910: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
4920: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
4930: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
4940: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
4950: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
4960: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
4970: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
4980: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
4990: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
49a0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69  umn as the row i
49b0: 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a  d.  (Exception:.
49c0: 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  ** For backwards
49d0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
49e0: 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61  ith older databa
49f0: 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  ses, do not do t
4a00: 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  his.** if the fi
4a10: 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  le format versio
4a20: 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  n number is less
4a30: 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74   than 1.)  Set t
4a40: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
4a50: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
4a60: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4a70: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
4a80: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
4a90: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
4aa0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
4ab0: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
4ac0: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
4ad0: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
4ae0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
4af0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
4b00: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
4b10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
4b20: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
4b30: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
4b40: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
4b50: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
4b60: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
4b70: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
4b80: 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72   sqliteAddPrimar
4b90: 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  yKey(Parse *pPar
4ba0: 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  se, IdList *pLis
4bb0: 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  t, int onError){
4bc0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
4bd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4be0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
4bf0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
4c00: 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  l = -1;.  if( pT
4c10: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
4c20: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
4c30: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
4c40: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4c50: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4c60: 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62  "table \"", pTab
4c70: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
4c80: 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74    "\" has more t
4c90: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
4ca0: 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  key", 0);.    pP
4cb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4cc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4cd0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
4ce0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
4cf0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
4d00: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
4d10: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
4d20: 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a  List->nId==1 ){.
4d30: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
4d40: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
4d50: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
4d60: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
4d70: 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e  p(pList->a[0].zN
4d80: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
4d90: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
4da0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
4db0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
4dc0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
4dd0: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
4de0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
4df0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
4e00: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
4e10: 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72 72  _Default ) onErr
4e20: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
4e30: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4e40: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20  >file_format>=1 
4e50: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  && .           z
4e60: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74  Type && sqliteSt
4e70: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
4e80: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
4e90: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
4ea0: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
4eb0: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
4ec0: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
4ed0: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
4ee0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
4ef0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
4f00: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
4f10: 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68  .** Come up with
4f20: 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61   a new random va
4f30: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63 68 65  lue for the sche
4f40: 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65  ma cookie.  Make
4f50: 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77   sure.** the new
4f60: 20 76 61 6c 75 65 20 69 73 20 64 69 66 66 65 72   value is differ
4f70: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64  ent from the old
4f80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
4f90: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
4fa0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
4fb0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
4fc0: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
4fd0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
4fe0: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
4ff0: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
5000: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
5010: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
5020: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
5030: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
5040: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
5050: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
5060: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
5070: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
5080: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
5090: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
50a0: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
50b0: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
50c0: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
50d0: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
50e0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
50f0: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
5100: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
5110: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
5120: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
5130: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
5140: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
5150: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
5160: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
5170: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
5180: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
5190: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
51a0: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
51b0: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
51c0: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
51d0: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
51e0: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
51f0: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
5200: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
5210: 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
5220: 6f 69 64 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65  oid changeCookie
5230: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
5240: 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  if( db->next_coo
5250: 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61 5f  kie==db->schema_
5260: 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64 62  cookie ){.    db
5270: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20  ->next_cookie = 
5280: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
5290: 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  e + sqliteRandom
52a0: 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20  Byte() + 1;.    
52b0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
52c0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
52d0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
52e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
52f0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
5300: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
5310: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
5320: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
5330: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
5340: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
5350: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
5360: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
5370: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
5380: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
5390: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
53a0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
53b0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
53c0: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
53d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
53e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
53f0: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
5400: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
5410: 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68  sk,.** unless th
5420: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
5430: 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46  y table or initF
5440: 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e  lag==1.  When in
5450: 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74  itFlag==1,.** it
5460: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
5470: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
5480: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
5490: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
54a0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
54b0: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
54c0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
54d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
54e0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
54f0: 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e  anges, so the en
5500: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
5510: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
5520: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
5530: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
5540: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
5550: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
5560: 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ain..*/.void sql
5570: 69 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73  iteEndTable(Pars
5580: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5590: 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61 62 6c 65   *pEnd){.  Table
55a0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *p;.  sqlite *d
55b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
55c0: 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 7c  .  if( pEnd==0 |
55d0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
55e0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
55f0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
5600: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
5610: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
5620: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
5630: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
5640: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
5650: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
5660: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
5670: 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  se..  */.  asser
5680: 74 28 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  t( pParse->nameC
5690: 6c 61 73 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73  lash==0 || pPars
56a0: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29  e->initFlag==1 )
56b0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
56c0: 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50  explain==0 && pP
56d0: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d  arse->nameClash=
56e0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
56f0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20  *pOld;.    pOld 
5700: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
5710: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
5720: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
5730: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
5740: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
5750: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5760: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
5770: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
5780: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
5790: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
57a0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
57b0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
57c0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
57d0: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
57e0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
57f0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
5800: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
5810: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
5820: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
5830: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
5840: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
5850: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
5860: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
5870: 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  disk.  So do not
5880: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
5890: 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20  sk.  ** again.  
58a0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
58b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
58c0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
58d0: 74 68 65 20 0a 20 20 2a 2a 20 70 50 61 72 73 65  the .  ** pParse
58e0: 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  ->newTnum field.
58f0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
5900: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  er should have b
5910: 65 65 6e 20 70 75 74 0a 20 20 2a 2a 20 74 68 65  een put.  ** the
5920: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
5930: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
5940: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
5950: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
5960: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50      p->tnum = pP
5970: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20  arse->newTnum;. 
5980: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
5990: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
59a0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
59b0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
59c0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
59d0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
59e0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
59f0: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
5a00: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
5a10: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 74 68  PORARY table, th
5a20: 65 6e 20 6a 75 73 74 20 63 72 65 61 74 65 20 74  en just create t
5a30: 68 65 20 74 61 62 6c 65 2e 20 20 44 6f 20 6e 6f  he table.  Do no
5a40: 74 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 6e 20 65  t.  ** make an e
5a50: 6e 74 72 79 20 69 6e 20 53 51 4c 49 54 45 5f 4d  ntry in SQLITE_M
5a60: 41 53 54 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ASTER..  */.  if
5a70: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
5a80: 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  lag ){.    int n
5a90: 2c 20 61 64 64 72 3b 0a 20 20 20 20 56 64 62 65  , addr;.    Vdbe
5aa0: 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71   *v;..    v = sq
5ab0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
5ac0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
5ad0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
5ae0: 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a  n = Addr(pEnd->z
5af0: 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d  ) - Addr(pParse-
5b00: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20  >sFirstToken.z) 
5b10: 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  + 1;.    if( !p-
5b20: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  >isTemp ){.     
5b30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5b40: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
5b50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
5b60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5b70: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
5b80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5b90: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
5ba0: 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f 53  1, "table", P3_S
5bb0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
5bc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5bd0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
5be0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5bf0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
5c00: 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  1, p->zName, P3_
5c10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
5c20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5c30: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
5c40: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5c50: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5c60: 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33  -1, p->zName, P3
5c70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
5c80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
5c90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5ca0: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c  _CreateTable, 0,
5cb0: 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20   p->isTemp);.   
5cc0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5cd0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
5ce0: 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50  ar *)&p->tnum, P
5cf0: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
5d00: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  p->tnum = 0;.   
5d10: 20 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20   if( !p->isTemp 
5d20: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
5d30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5d40: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
5d50: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5d60: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
5d70: 20 61 64 64 72 2c 20 70 50 61 72 73 65 2d 3e 73   addr, pParse->s
5d80: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29  FirstToken.z, n)
5d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5da0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
5db0: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
5dc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
5dd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
5de0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
5df0: 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69       changeCooki
5e00: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  e(db);.      sql
5e10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5e20: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 64 62  OP_SetCookie, db
5e30: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30  ->next_cookie, 0
5e40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5e50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5e60: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
5e70: 20 7d 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e   }.    if( (db->
5e80: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
5e90: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
5ea0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5eb0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
5ec0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
5ed0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
5ee0: 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20  n a token, look 
5ef0: 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  up a table with 
5f00: 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e  that name.  If n
5f10: 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a  ot found, leave.
5f20: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  ** an error for 
5f30: 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69  the parser to fi
5f40: 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  nd and return NU
5f50: 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  LL..*/.Table *sq
5f60: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
5f70: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
5f80: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  , Token *pTok){.
5f90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
5fa0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5fb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
5fc0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
5fd0: 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e  (pTok);.  if( zN
5fe0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
5ff0: 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  0;.  pTab = sqli
6000: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
6010: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
6020: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
6030: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  me);.  if( pTab=
6040: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6050: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
6060: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
6070: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
6080: 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b  0, .        pTok
6090: 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29  ->z, pTok->n, 0)
60a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
60b0: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
60c0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
60d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
60e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
60f0: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
6100: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
6110: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
6120: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
6130: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
6140: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
6150: 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  teDropTable(Pars
6160: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6170: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
6180: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62  e *pTable;.  Vdb
6190: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
61a0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
61b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
61c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
61d0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
61e0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
61f0: 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  n;.  pTable = sq
6200: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
6210: 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  en(pParse, pName
6220: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
6230: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6240: 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f  f( pTable->readO
6250: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
6260: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
6270: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
6280: 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ble ", pTable->z
6290: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20  Name, .       " 
62a0: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
62b0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
62c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
62d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
62e0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
62f0: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
6300: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
6310: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
6320: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
6330: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
6340: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
6350: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
6360: 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c   VdbeOp dropTabl
6370: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
6380: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30  OP_OpenWrite,  0
6390: 2c 20 32 2c 20 20 20 20 20 20 20 20 4d 41 53 54  , 2,        MAST
63a0: 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20  ER_NAME},.      
63b0: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
63c0: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d   0, ADDR(9),  0}
63d0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
63e0: 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ing,     0, 0,  
63f0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a        0}, /* 2 *
6400: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
6410: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
6420: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
6430: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
6440: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
6450: 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20  , /* 4 */.      
6460: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
6470: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
6480: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
6490: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
64a0: 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (8),  0},.      
64b0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
64c0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
64d0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
64e0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
64f0: 28 34 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20 2a  (4),  0}, /* 8 *
6500: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  /.      { OP_Set
6510: 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20  Cookie,  0, 0,  
6520: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a        0}, /* 9 *
6530: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f  /.      { OP_Clo
6540: 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20  se,      0, 0,  
6550: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
6560: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
6570: 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66  ;.    if( (db->f
6580: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
6590: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
65a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
65b0: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
65c0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
65d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
65e0: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
65f0: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d  ookie, db->schem
6600: 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  a_cookie, 0);.  
6610: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65      pParse->sche
6620: 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a  maVerified = 1;.
6630: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
6640: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b  Table->isTemp ){
6650: 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71  .      base = sq
6660: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
6670: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
6680: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
6690: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
66a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
66b0: 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c  v, base+2, pTabl
66c0: 65 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  e->zName, P3_STA
66d0: 54 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  TIC);.      chan
66e0: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
66f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6700: 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 39  angeP1(v, base+9
6710: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
6720: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
6730: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6740: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61   OP_Destroy, pTa
6750: 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  ble->tnum, pTabl
6760: 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  e->isTemp);.    
6770: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
6780: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6790: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
67a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
67b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
67c0: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
67d0: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
67e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
67f0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
6800: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
6810: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6820: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6830: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
6840: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6850: 4d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 28  Move the table (
6860: 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  and all its indi
6870: 63 65 73 29 20 74 6f 20 74 68 65 20 70 65 6e 64  ces) to the pend
6880: 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2e 0a  ing DROP queue..
6890: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20    ** Or, if the 
68a0: 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20  table was never 
68b0: 63 6f 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74 20  committed, just 
68c0: 64 65 6c 65 74 65 20 69 74 2e 20 20 49 66 20 74  delete it.  If t
68d0: 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
68e0: 73 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  s been committed
68f0: 20 61 6e 64 20 69 73 20 70 6c 61 63 65 64 20 6f   and is placed o
6900: 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52  n the pending DR
6910: 4f 50 20 71 75 65 75 65 2c 20 74 68 65 6e 20 74  OP queue, then t
6920: 68 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 77  he.  ** delete w
6930: 69 6c 6c 20 6f 63 63 75 72 20 77 68 65 6e 20 73  ill occur when s
6940: 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72  qliteCommitInter
6950: 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 65 78 65  nalChanges() exe
6960: 63 75 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cutes..  **.  **
6970: 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74   Exception: if t
6980: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6990: 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20   began with the 
69a0: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c  EXPLAIN keyword,
69b0: 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68  .  ** then no ch
69c0: 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  anges should be 
69d0: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  made..  */.  if(
69e0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
69f0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 50  n ){.    sqliteP
6a00: 65 6e 64 69 6e 67 44 72 6f 70 54 61 62 6c 65 28  endingDropTable(
6a10: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20  db, pTable);.   
6a20: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6a30: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
6a40: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
6a50: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
6a60: 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
6a70: 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73  able.  pIndex is
6a80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6a90: 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
6aa0: 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  Table is the nam
6ab0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6ac0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
6ad0: 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
6ae0: 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
6af0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
6b00: 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
6b10: 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
6b20: 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
6b30: 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
6b40: 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
6b50: 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
6b60: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
6b70: 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
6b80: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
6b90: 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
6ba0: 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
6bb0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
6bc0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
6bd0: 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
6be0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6bf0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
6c00: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
6c10: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
6c20: 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
6c30: 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
6c40: 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
6c50: 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
6c60: 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
6c70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
6c80: 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
6c90: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
6ca0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
6cb0: 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69  uction.  .*/.voi
6cc0: 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e  d sqliteCreateIn
6cd0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
6ce0: 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69  arse,   /* All i
6cf0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
6d00: 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
6d10: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
6d20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
6d30: 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20   index.  May be 
6d40: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
6d50: 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61  *pTable,   /* Na
6d60: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6d70: 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70  to index.  Use p
6d80: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6d90: 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73   if 0 */.  IdLis
6da0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
6db0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
6dc0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
6dd0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
6de0: 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
6df0: 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
6e00: 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
6e10: 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
6e20: 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65  pStart,   /* The
6e30: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
6e40: 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41  at begins a CREA
6e50: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6e60: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
6e70: 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20  End      /* The 
6e80: 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
6e90: 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
6ea0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
6eb0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
6ec0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
6ed0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
6ee0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
6ef0: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
6f00: 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
6f10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
6f20: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
6f30: 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20  Token nullId;   
6f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
6f50: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
6f60: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
6f70: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
6f80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
6f90: 20 68 69 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20   hideName = 0;  
6fa0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6fb0: 20 70 75 74 20 74 61 62 6c 65 20 6e 61 6d 65 20   put table name 
6fc0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
6fd0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72  e */..  if( pPar
6fe0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
6ff0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
7000: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
7010: 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a  ate_index;..  /*
7020: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
7030: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
7040: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
7050: 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
7060: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
7070: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
7080: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
7090: 65 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e!=0 );.    pTab
70a0: 20 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65 46   =  sqliteTableF
70b0: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  romToken(pParse,
70c0: 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
70d0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
70e0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
70f0: 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
7100: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
7110: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
7120: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
7130: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
7140: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
7150: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
7160: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
7170: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
7180: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
7190: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
71a0: 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65    " may not have
71b0: 20 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64 64   new indices add
71c0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
71d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
71e0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
71f0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
7200: 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
7210: 20 69 73 20 63 72 65 61 74 65 64 20 77 68 69 6c   is created whil
7220: 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65  e re-reading the
7230: 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c   schema from sql
7240: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
7250: 62 75 74 20 74 68 65 20 74 61 62 6c 65 20 61 73  but the table as
7260: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
7270: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 74 65  is index is a te
7280: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 69  mporary table, i
7290: 74 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  t can.  ** only 
72a0: 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 74 61  mean that the ta
72b0: 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 6e  ble that this in
72c0: 64 65 78 20 69 73 20 72 65 61 6c 6c 79 20 61 73  dex is really as
72d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 73  sociated with is
72e0: 0a 20 20 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20  .  ** one whose 
72f0: 6e 61 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62  name is hidden b
7300: 65 68 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72  ehind a temporar
7310: 79 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  y table with the
7320: 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a   same name..  **
7330: 20 53 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65   Since its table
7340: 20 68 61 73 20 62 65 65 6e 20 73 75 70 70 72 65   has been suppre
7350: 73 73 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f  ssed, we need to
7360: 20 61 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74   also suppress t
7370: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20  he.  ** index.. 
7380: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
7390: 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 70 54  ->initFlag && pT
73a0: 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20  ab->isTemp ){.  
73b0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
73c0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
73d0: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
73e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
73f0: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
7400: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
7410: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
7420: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
7430: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
7440: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
7450: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
7460: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
7470: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
7480: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
7490: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
74a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
74b0: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
74c0: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
74d0: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
74e0: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
74f0: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
7500: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
7510: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
7520: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
7530: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
7540: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
7550: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
7560: 20 69 6e 64 65 78 2c 20 62 75 74 20 77 65 20 77   index, but we w
7570: 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f  ill not.  ** sto
7580: 72 65 20 69 74 73 20 6e 61 6d 65 20 69 6e 20 74  re its name in t
7590: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
75a0: 53 65 74 20 74 68 65 20 68 69 64 65 4e 61 6d 65  Set the hideName
75b0: 20 66 6c 61 67 20 74 6f 20 61 63 63 6f 6d 70 6c   flag to accompl
75c0: 69 73 68 0a 20 20 2a 2a 20 74 68 69 73 2e 0a 20  ish.  ** this.. 
75d0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
75e0: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
75f0: 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
7600: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
7610: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
7620: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
7630: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
7640: 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
7650: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
7660: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e   pName ){.    In
7670: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
7680: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
7690: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
76a0: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  me name */.    T
76b0: 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
76c0: 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
76d0: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
76e0: 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
76f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7700: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
7710: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
7720: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
7730: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
7740: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28  index;.    if( (
7750: 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pISameName = sql
7760: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
7770: 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20   zName))!=0 ){. 
7780: 20 20 20 20 20 69 66 28 20 70 49 53 61 6d 65 4e       if( pISameN
7790: 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54  ame->pTable->isT
77a0: 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69  emp && pParse->i
77b0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  nitFlag ){.     
77c0: 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b     hideName = 1;
77d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
77e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
77f0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
7800: 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22  ErrMsg, "index "
7810: 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  , zName, .      
7820: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
7830: 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20 20  xists", 0);.    
7840: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
7850: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ++;.        goto
7860: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
7870: 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
7880: 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53 61 6d  }.    if( (pTSam
7890: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
78a0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
78b0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
78c0: 69 66 28 20 70 54 53 61 6d 65 4e 61 6d 65 2d 3e  if( pTSameName->
78d0: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
78e0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
78f0: 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d        hideName =
7900: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
7910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
7920: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
7930: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72  ->zErrMsg, "ther
7940: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
7950: 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20  able named ",.  
7960: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7970: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
7980: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
7990: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
79a0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
79b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
79c0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
79d0: 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  [30];.    int n;
79e0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
79f0: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
7a00: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
7a10: 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
7a20: 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
7a30: 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74  ++){}.    sprint
7a40: 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b  f(zBuf,"%d)",n);
7a50: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
7a60: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
7a70: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c  ing(&zName, "(",
7a80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20   pTab->zName, " 
7a90: 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75  autoindex ", zBu
7aa0: 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  f, 0);.    if( z
7ab0: 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
7ac0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7ad0: 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d  ;.    hideName =
7ae0: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
7af0: 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a  (db, zName)!=0;.
7b00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69    }..  /* If pLi
7b10: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
7b20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
7b30: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
7b40: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
7b50: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
7b60: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
7b70: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
7b80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7b90: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
7ba0: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
7bb0: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
7bc0: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
7bd0: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
7be0: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
7bf0: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
7c00: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
7c10: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
7c20: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
7c30: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70   sqliteIdListApp
7c40: 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  end(0, &nullId);
7c50: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
7c60: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
7c70: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
7c80: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
7c90: 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
7ca0: 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
7cb0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
7cc0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7cd0: 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
7ce0: 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
7d10: 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20  *pList->nId );. 
7d20: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
7d30: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
7d40: 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65  e_index;.  pInde
7d50: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
7d60: 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a  nt*)&pIndex[1];.
7d70: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
7d80: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
7d90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
7da0: 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79  ->nId];.  strcpy
7db0: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
7dc0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
7dd0: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
7de0: 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
7df0: 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b  mn = pList->nId;
7e00: 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
7e10: 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 69 73 55  or = pIndex->isU
7e20: 6e 69 71 75 65 20 3d 20 6f 6e 45 72 72 6f 72 3b  nique = onError;
7e30: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
7e40: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
7e50: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
7e60: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
7e70: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
7e80: 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
7e90: 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
7ea0: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
7eb0: 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
7ec0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
7ed0: 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
7ee0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
7ef0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
7f00: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
7f10: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
7f20: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7f30: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
7f40: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
7f50: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
7f60: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
7f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
7f80: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
7f90: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7fa0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7fb0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
7fc0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
7fd0: 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f       " has no co
7fe0: 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c  lumn named ", pL
7ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
8000: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
8010: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
8020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
8030: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
8040: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
8050: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
8060: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
8070: 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = j;.  }..  /* 
8080: 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
8090: 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
80a0: 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
80b0: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
80c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
80d0: 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
80e0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
80f0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 21  se->explain && !
8100: 68 69 64 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hideName ){.    
8110: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
8120: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
8130: 72 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c  rt(&db->idxHash,
8140: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
8150: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c  strlen(zName)+1,
8160: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
8170: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
8180: 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
8190: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
81a0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
81b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
81c0: 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e(pIndex);.     
81d0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
81e0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
81f0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
8200: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
8210: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nges;.  }..  /* 
8220: 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
8230: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
8240: 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
8250: 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
8260: 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
8270: 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
8280: 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
8290: 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
82a0: 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
82b0: 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
82c0: 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
82d0: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
82e0: 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
82f0: 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
8300: 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d  .  if( onError!=
8310: 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
8320: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
8330: 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
8340: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
8350: 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
8360: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
8370: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
8380: 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
8390: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65   pIndex;.  }else
83a0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74  {.    Index *pOt
83b0: 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
83c0: 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ex;.    while( p
83d0: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
83e0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
83f0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
8400: 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68  ce ){.      pOth
8410: 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
8420: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  xt;.    }.    pI
8430: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
8440: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
8450: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
8460: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20   pIndex;.  }..  
8470: 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c  /* If the initFl
8480: 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  ag is 1 it means
8490: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
84a0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
84b0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
84c0: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
84d0: 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e  e disk.  So do n
84e0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
84f0: 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  disk.  ** again.
8500: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74 61    Extract the ta
8510: 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20  ble number from 
8520: 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54  the pParse->newT
8530: 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a  num field..  */.
8540: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
8550: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c 65  itFlag && pTable
8560: 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  !=0 ){.    pInde
8570: 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65  x->tnum = pParse
8580: 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  ->newTnum;.  }..
8590: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
85a0: 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20 63  Flag is 0 then c
85b0: 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
85c0: 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
85d0: 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
85e0: 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
85f0: 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
8600: 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
8610: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
8620: 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
8630: 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
8640: 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
8650: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20  e initFlag is 0 
8660: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
8670: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
8680: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
8690: 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e  command.  The in
86a0: 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e  itFlag is 1 when
86b0: 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
86c0: 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
86d0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
86e0: 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
86f0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
8700: 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
8710: 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
8720: 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
8730: 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
8740: 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
8750: 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
8760: 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
8770: 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
8780: 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d  f pTable==0 it m
8790: 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
87a0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
87b0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
87c0: 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
87d0: 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
87e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
87f0: 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
8800: 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
8810: 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
8820: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
8830: 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
8840: 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
8850: 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
8860: 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
8870: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61  /.  else if( pPa
8880: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30  rse->initFlag==0
8890: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
88a0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
88b0: 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a  int lbl1, lbl2;.
88c0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
88d0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74  nt addr;.    int
88e0: 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
88f0: 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20 76 20 3d  isTemp;..    v =
8900: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
8910: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
8920: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
8930: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
8940: 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30     if( pTable!=0
8950: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 64   ){.      if( (d
8960: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8970: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
8980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8990: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
89a0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
89b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
89c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
89d0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64  _VerifyCookie, d
89e0: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
89f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
8a00: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
8a10: 66 69 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  fied = 1;.      
8a20: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  }.      if( !isT
8a30: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
8a40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8a50: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
8a60: 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 2);.        s
8a70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
8a80: 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f  3(v, -1, MASTER_
8a90: 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29  NAME, P3_STATIC)
8aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8ab0: 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20      if( !isTemp 
8ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
8ad0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
8ae0: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
8af0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8b00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
8b10: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
8b20: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8b30: 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65  eP3(v, -1, "inde
8b40: 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  x", P3_STATIC);.
8b50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
8b70: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
8b80: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8b90: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65  eP3(v, -1, pInde
8ba0: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
8bb0: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
8bc0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8bd0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
8be0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8bf0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
8c00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
8c10: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
8c20: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
8c30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8c40: 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c  _CreateIndex, 0,
8c50: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71   isTemp);.    sq
8c60: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
8c70: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
8c80: 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  )&pIndex->tnum, 
8c90: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
8ca0: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
8cb0: 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  0;.    if( pTabl
8cc0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  e ){.      if( i
8cd0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
8ce0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8cf0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
8d00: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
8d10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8d20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8d30: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
8d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8d50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
8d60: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
8d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8d80: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
8d90: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
8da0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8db0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
8dc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
8dd0: 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
8de0: 20 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28         n = Addr(
8df0: 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
8e00: 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a  pStart->z) + 1;.
8e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8e20: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
8e30: 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e  dr, pStart->z, n
8e40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8e50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8e60: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8e70: 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 5, 0);.      
8e80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8e90: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
8ea0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
8eb0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
8ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8ed0: 41 64 64 4f 70 28 76 2c 20 69 73 54 65 6d 70 20  AddOp(v, isTemp 
8ee0: 3f 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f  ? OP_OpenAux : O
8ef0: 50 5f 4f 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d  P_Open, 2, pTab-
8f00: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  >tnum);.      sq
8f10: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
8f20: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
8f30: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
8f40: 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
8f50: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
8f60: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
8f70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8f80: 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c  P_Rewind, 2, lbl
8f90: 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  2);.      lbl1 =
8fa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8fb0: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c  (v, OP_Recno, 2,
8fc0: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
8fd0: 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
8fe0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
8ff0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9000: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
9010: 6e 2c 20 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69  n, 2, pIndex->ai
9020: 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20  Column[i]);.    
9030: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9040: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9050: 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64  MakeIdxKey, pInd
9060: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ex->nColumn, 0);
9070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
9090: 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e  Put, 1, pIndex->
90a0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
90b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
90c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
90d0: 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20  ext, 2, lbl1);. 
90e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
90f0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
9100: 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl2);.      sqli
9110: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9120: 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a  P_Close, 2, 0);.
9130: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9140: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
9150: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  e, 1, 0);.    }.
9160: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
9170: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
9180: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
9190: 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64    changeCookie(d
91a0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
91b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
91c0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 64 62 2d  P_SetCookie, db-
91d0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29  >next_cookie, 0)
91e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
91f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9200: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
9210: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9220: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
9230: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
9240: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9250: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9260: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
9270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9280: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
9290: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
92a0: 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
92b0: 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64  ndex:.  sqliteId
92c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
92d0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
92e0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
92f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9300: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
9310: 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
9320: 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
9330: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
9340: 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
9350: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
9360: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
9370: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
9380: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9390: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
93a0: 70 49 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a  pIndex;.  char *
93b0: 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  zName;.  Vdbe *v
93c0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
93d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
93e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
93f0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
9400: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
9410: 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  n;.  zName = sql
9420: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
9430: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
9440: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
9450: 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20  eturn;.  pIndex 
9460: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
9470: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  x(db, zName);.  
9480: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
9490: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
94a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
94b0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
94c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
94d0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20   such index: ", 
94e0: 30 2c 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d  0, .        pNam
94f0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
9500: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
9510: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
9520: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rn;.  }..  /* Ge
9530: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
9540: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
9550: 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
9560: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
9570: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
9580: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9590: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
95a0: 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78  VdbeOp dropIndex
95b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
95c0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c  P_OpenWrite,  0,
95d0: 20 32 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52   2,       MASTER
95e0: 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20  _NAME},.      { 
95f0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
9600: 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c 20 0a  , ADDR(10),0}, .
9610: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
9620: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
9630: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
9640: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
9650: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
9660: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9670: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
9680: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
9690: 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  4 */.      { OP_
96a0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31  Column,     0, 1
96b0: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
96c0: 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20    { OP_Eq,      
96d0: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
96e0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
96f0: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
9700: 52 28 34 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(4), 0},.      
9710: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
9720: 20 30 2c 20 41 44 44 52 28 31 30 29 2c 30 7d 2c   0, ADDR(10),0},
9730: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
9740: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
9750: 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a      0}, /* 9 */.
9760: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
9770: 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  okie,  0, 0,    
9780: 20 20 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a     0}, /* 10 */.
9790: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65        { OP_Close
97a0: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  ,      0, 0,    
97b0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
97c0: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20    int base;.    
97d0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
97e0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  ndex->pTable;.. 
97f0: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
9800: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
9810: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ns)==0 ){.      
9820: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9830: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
9840: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
9850: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9860: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
9870: 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  ie, db->schema_c
9880: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
9890: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
98a0: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 20  erified = 1;.   
98b0: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 54 61 62   }.    if( !pTab
98c0: 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ->isTemp ){.    
98d0: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
98e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
98f0: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
9900: 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
9910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9920: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
9930: 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+2, pIndex->zN
9940: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
9950: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f  .      changeCoo
9960: 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73  kie(db);.      s
9970: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
9980: 31 28 76 2c 20 62 61 73 65 2b 31 30 2c 20 64 62  1(v, base+10, db
9990: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a  ->next_cookie);.
99a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
99b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
99c0: 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d  Destroy, pIndex-
99d0: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73 54  >tnum, pTab->isT
99e0: 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 28 64  emp);.    if( (d
99f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9a00: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
9a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9a20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
9a30: 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  mit, 0, 0);.    
9a40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  }.  }..  /* Move
9a50: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 74 6f 20   the index onto 
9a60: 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50  the pending DROP
9a70: 20 71 75 65 75 65 2e 20 20 4f 72 2c 20 69 66 20   queue.  Or, if 
9a80: 74 68 65 20 69 6e 64 65 78 20 77 61 73 0a 20 20  the index was.  
9a90: 2a 2a 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74  ** never committ
9aa0: 65 64 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20  ed, just delete 
9ab0: 69 74 2e 20 20 49 6e 64 69 63 65 73 20 6f 6e 20  it.  Indices on 
9ac0: 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50  the pending DROP
9ad0: 20 71 75 65 75 65 0a 20 20 2a 2a 20 67 65 74 20   queue.  ** get 
9ae0: 64 65 6c 65 74 65 64 20 62 79 20 73 71 6c 69 74  deleted by sqlit
9af0: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
9b00: 68 61 6e 67 65 73 28 29 20 77 68 65 6e 20 74 68  hanges() when th
9b10: 65 20 75 73 65 72 20 65 78 65 63 75 74 65 73 0a  e user executes.
9b20: 20 20 2a 2a 20 61 20 43 4f 4d 4d 49 54 2e 20 20    ** a COMMIT.  
9b30: 4f 72 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  Or if a rollback
9b40: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6c 65   occurs, the ele
9b50: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 44 52 4f  ments of the DRO
9b60: 50 20 71 75 65 75 65 0a 20 20 2a 2a 20 61 72 65  P queue.  ** are
9b70: 20 6d 6f 76 65 64 20 62 61 63 6b 20 69 6e 74 6f   moved back into
9b80: 20 74 68 65 20 6d 61 69 6e 20 68 61 73 68 20 74   the main hash t
9b90: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
9ba0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
9bb0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 50  n ){.    sqliteP
9bc0: 65 6e 64 69 6e 67 44 72 6f 70 49 6e 64 65 78 28  endingDropIndex(
9bd0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  db, pIndex);.   
9be0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
9bf0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
9c00: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
9c10: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
9c20: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
9c30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9c40: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
9c50: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
9c60: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
9c70: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
9c80: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
9c90: 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c  ist *sqliteExprL
9ca0: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
9cb0: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
9cc0: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
9cd0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
9ce0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
9cf0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
9d00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
9d10: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
9d20: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
9d30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9d40: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
9d50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9d60: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
9d70: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
9d80: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
9d90: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
9da0: 45 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 73 74  Expr + 8;.    st
9db0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9dc0: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73  em *a;.    a = s
9dd0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
9de0: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
9df0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
9e00: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
9e10: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
9e20: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
9e30: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
9e40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
9e50: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
9e60: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
9e70: 6d 65 20 29 7b 0a 20 20 20 20 69 20 3d 20 70 4c  me ){.    i = pL
9e80: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20  ist->nExpr++;.  
9e90: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
9ea0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
9eb0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
9ec0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  me = 0;.    if( 
9ed0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  pName ){.      s
9ee0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
9ef0: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  &pList->a[i].zNa
9f00: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
9f10: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
9f20: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
9f30: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
9f40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9f50: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
9f60: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
9f70: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
9f80: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
9f90: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
9fa0: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
9fb0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
9fc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
9fd0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
9fe0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
9ff0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
a000: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
a010: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
a020: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
a030: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
a040: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
a050: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
a060: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a070: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
a080: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
a090: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
a0a0: 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
a0b0: 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
a0c0: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
a0d0: 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
a0e0: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
a0f0: 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
a100: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
a110: 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73  ist *sqliteIdLis
a120: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
a130: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
a140: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
a150: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
a160: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
a170: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
a180: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
a190: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
a1a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69  ;.  }.  if( (pLi
a1b0: 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20  st->nId & 7)==0 
a1c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
a1d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
a1e0: 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
a1f0: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70  loc(pList->a, (p
a200: 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a  List->nId+8)*siz
a210: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
a220: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
a230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a240: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
a250: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
a260: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
a270: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
a280: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
a290: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
a2a0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
a2b0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
a2c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
a2d0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
a2e0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
a2f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
a300: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
a310: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
a320: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  n->n, 0);.    if
a330: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
a340: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
a350: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
a360: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
a380: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
a390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c  ;.    }.  }.  pL
a3a0: 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
a3b0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
a3c0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
a3d0: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
a3e0: 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
a3f0: 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
a400: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
a410: 71 6c 69 74 65 49 64 4c 69 73 74 41 64 64 41 6c  qliteIdListAddAl
a420: 69 61 73 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ias(IdList *pLis
a430: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
a440: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
a450: 26 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29  & pList->nId>0 )
a460: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c  {.    int i = pL
a470: 69 73 74 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20  ist->nId - 1;.  
a480: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
a490: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
a4a0: 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
a4b0: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
a4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
a4d0: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
a4e0: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
a4f0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
a500: 65 6e 74 69 72 65 20 49 64 4c 69 73 74 0a 2a 2f  entire IdList.*/
a510: 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69  .void sqliteIdLi
a520: 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
a530: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
a540: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
a550: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
a560: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
a570: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
a580: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
a590: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
a5a0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
a5b0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
a5c0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
a5d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a  a[i].pSelect ){.
a5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
a5f0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
a600: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
a610: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 4c  eSelectDelete(pL
a620: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
a630: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a640: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
a650: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
a660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a670: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
a680: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
a690: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  (pList);.}.../*.
a6a0: 2a 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d  ** The COPY comm
a6b0: 61 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70 61  and is for compa
a6c0: 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 50 6f  tibility with Po
a6d0: 73 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70 65  stgreSQL and spe
a6e0: 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f  cificially.** fo
a6f0: 72 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  r the ability to
a700: 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74   read the output
a710: 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54 68   of pg_dump.  Th
a720: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a  e format is as.*
a730: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
a740: 20 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20 46      COPY table F
a750: 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47 20  ROM file [USING 
a760: 44 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69 6e  DELIMITERS strin
a770: 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22  g].**.** "table"
a780: 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
a790: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20  table name.  We 
a7a0: 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73 20  will read lines 
a7b0: 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20  of code from.** 
a7c0: 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68 69  file to fill thi
a7d0: 73 20 74 61 62 6c 65 20 77 69 74 68 20 64 61 74  s table with dat
a7e0: 61 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20 62  a.  File might b
a7f0: 65 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65 20  e "stdin".  The 
a800: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69  optional.** deli
a810: 6d 69 74 65 72 20 73 74 72 69 6e 67 20 69 64 65  miter string ide
a820: 6e 74 69 66 69 65 73 20 74 68 65 20 66 69 65 6c  ntifies the fiel
a830: 64 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 54  d separators.  T
a840: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 61 20  he default is a 
a850: 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tab..*/.void sql
a860: 69 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73 65  iteCopy(.  Parse
a870: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a880: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
a890: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
a8a0: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *pTableName,   
a8b0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
a8c0: 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  he table into wh
a8d0: 69 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65  ich we will inse
a8e0: 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  rt */.  Token *p
a8f0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
a900: 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68  The file from wh
a910: 69 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e  ich to obtain in
a920: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  formation */.  T
a930: 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72  oken *pDelimiter
a940: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20      /* Use this 
a950: 61 73 20 74 68 65 20 66 69 65 6c 64 20 64 65 6c  as the field del
a960: 69 6d 69 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 54  imiter */.){.  T
a970: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68  able *pTab;.  ch
a980: 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20  ar *zTab;.  int 
a990: 69 2c 20 6a 3b 0a 20 20 56 64 62 65 20 2a 76 3b  i, j;.  Vdbe *v;
a9a0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64  .  int addr, end
a9b0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
a9c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
a9d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a  pParse->db;..  z
a9e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
a9f0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
aa00: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66  TableName);.  if
aa10: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
aa20: 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d  failed || zTab==
aa30: 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c  0 ) goto copy_cl
aa40: 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20  eanup;.  pTab = 
aa50: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
aa60: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  db, zTab);.  sql
aa70: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
aa80: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
aa90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
aaa0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
aab0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
aac0: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
aad0: 20 20 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65        pTableName
aae0: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
aaf0: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
ab00: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
ab10: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
ab20: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  p;.  }.  if( pTa
ab30: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
ab40: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
ab50: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
ab60: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
ab70: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
ab80: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
ab90: 20 6d 6f 64 69 66 69 65 64 22 2c 20 30 29 3b 0a   modified", 0);.
aba0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
abb0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70  ++;.    goto cop
abc0: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  y_cleanup;.  }. 
abd0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
abe0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
abf0: 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( v ){.    int o
ac00: 70 65 6e 4f 70 3b 0a 20 20 20 20 69 66 28 20 28  penOp;.    if( (
ac10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
ac20: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
ac30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
ac40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
ac50: 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29  ansaction, 0, 0)
ac60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ac70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
ac80: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e  rifyCookie, db->
ac90: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
aca0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
acb0: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
acc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 1;.    }.    a
acd0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
ace0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
acf0: 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Open, 0, 0);.   
ad00: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
ad10: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69  eP3(v, addr, pFi
ad20: 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65  lename->z, pFile
ad30: 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  name->n);.    sq
ad40: 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50  liteVdbeDequoteP
ad50: 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  3(v, addr);.    
ad60: 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69  openOp = pTab->i
ad70: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57  sTemp ? OP_OpenW
ad80: 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72  rAux : OP_OpenWr
ad90: 69 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ite;.    sqliteV
ada0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e  dbeAddOp(v, open
adb0: 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75  Op, 0, pTab->tnu
adc0: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  m);.    sqliteVd
add0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
ade0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
adf0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66  3_STATIC);.    f
ae00: 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61  or(i=1, pIdx=pTa
ae10: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
ae20: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ae30: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t, i++){.      s
ae40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ae50: 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70 49 64  , openOp, i, pId
ae60: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  x->tnum);.      
ae70: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
ae80: 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e  P3(v, -1, pIdx->
ae90: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
aea0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64  );.    }.    end
aeb0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
aec0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61  eLabel(v);.    a
aed0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
aee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
aef0: 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Read, pTab->nCol
af00: 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  , end);.    if( 
af10: 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20  pDelimiter ){.  
af20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
af30: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
af40: 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70  pDelimiter->z, p
af50: 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20  Delimiter->n);. 
af60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44       sqliteVdbeD
af70: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
af80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
af90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
afa0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
afb0: 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  "\t", 1);.    }.
afc0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50      if( pTab->iP
afd0: 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key>=0 ){.      
afe0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aff0: 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e  v, OP_FileColumn
b000: 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30  , pTab->iPKey, 0
b010: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b020: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b030: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
b040: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b050: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b060: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
b070: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
b080: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e     if( pTab->pIn
b090: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dex ){.      sql
b0a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b0b0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
b0c0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
b0d0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
b0e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
b0f0: 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  i==pTab->iPKey )
b100: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b110: 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   integer primary
b120: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 66   key column is f
b130: 69 6c 6c 65 64 20 77 69 74 68 20 4e 55 4c 4c 20  illed with NULL 
b140: 73 69 6e 63 65 20 69 74 73 0a 20 20 20 20 20 20  since its.      
b150: 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 61 6c    ** value is al
b160: 77 61 79 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  ways pulled from
b170: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
b180: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  er */.        sq
b190: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b1a0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
b1b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b1c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b1d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
b1e0: 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b  leColumn, i, 0);
b1f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b200: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b210: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
b220: 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ord, pTab->nCol,
b230: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
b240: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
b250: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
b260: 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
b270: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
b280: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
b290: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
b2a0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70       if( pIdx->p
b2b0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
b2c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b2d0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
b2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2f0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
b300: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
b310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b320: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
b330: 6c 65 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e  leColumn, pIdx->
b340: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 29 3b  aiColumn[j], 0);
b350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b360: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b370: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
b380: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20   pIdx->nColumn, 
b390: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b3a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b3b0: 49 64 78 50 75 74 2c 20 69 2c 20 70 49 64 78 2d  IdxPut, i, pIdx-
b3c0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
b3d0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
b3e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b3f0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
b400: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  r);.    sqliteVd
b410: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b420: 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  , end);.    sqli
b430: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b440: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
b450: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
b460: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
b470: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ns)==0 ){.      
b480: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b490: 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c  v, OP_Commit, 0,
b4a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
b4b0: 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a   .copy_cleanup:.
b4c0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
b4d0: 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  ** The non-stand
b4e0: 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  ard VACUUM comma
b4f0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c  nd is used to cl
b500: 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62  ean up the datab
b510: 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65  ase,.** collapse
b520: 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63   free space, etc
b530: 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65  .  It is modelle
b540: 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55  d after the VACU
b550: 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e  UM command.** in
b560: 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2f 0a   PostgreSQL..*/.
b570: 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75  void sqliteVacuu
b580: 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  m(Parse *pParse,
b590: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
b5a0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
b5b0: 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  me;.  Vdbe *v;. 
b5c0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
b5d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
b5e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
b5f0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
b600: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
b610: 20 20 69 66 28 20 70 54 61 62 6c 65 4e 61 6d 65    if( pTableName
b620: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
b630: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
b640: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e  romToken(pTableN
b650: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
b660: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
b670: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26  }.  if( zName &&
b680: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
b690: 28 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 0a 20  (db, zName)==0. 
b6a0: 20 20 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64     && sqliteFind
b6b0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29  Table(db, zName)
b6c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b6d0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b6e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
b6f0: 20 73 75 63 68 20 74 61 62 6c 65 20 6f 72 20 69   such table or i
b700: 6e 64 65 78 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20  ndex: ", zName, 
b710: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
b720: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
b730: 20 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b   vacuum_cleanup;
b740: 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
b750: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
b760: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
b770: 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c 65 61 6e  oto vacuum_clean
b780: 75 70 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  up;.  if( (db->f
b790: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
b7a0: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
b7b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b7c0: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
b7d0: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  on, 0, 0);.    s
b7e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b7f0: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
b800: 65 2c 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e, db->schema_co
b810: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  okie, 0);.    pP
b820: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
b830: 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  fied = 1;.  }.  
b840: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
b850: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b860: 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a  (v, OP_Reorganiz
b870: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
b880: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
b890: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
b8a0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
b8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 61 62 6c   }else{.    Tabl
b8c0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64  e *pTab;.    Ind
b8d0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61  ex *pIdx;.    Ha
b8e0: 73 68 45 6c 65 6d 20 2a 70 45 3b 0a 20 20 20 20  shElem *pE;.    
b8f0: 66 6f 72 28 70 45 3d 73 71 6c 69 74 65 48 61 73  for(pE=sqliteHas
b900: 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48  hFirst(&db->tblH
b910: 61 73 68 29 3b 20 70 45 3b 20 70 45 3d 73 71 6c  ash); pE; pE=sql
b920: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 29 29  iteHashNext(pE))
b930: 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  {.      pTab = s
b940: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
b950: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b960: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
b970: 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 29  eorganize, 0, 0)
b980: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b990: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
b9a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
b9b0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
b9c0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
b9d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
b9e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
b9f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
ba00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
ba10: 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 29  eorganize, 0, 0)
ba20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ba30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
ba40: 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  -1, pIdx->zName,
ba50: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
ba60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ba70: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
ba80: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ba90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
baa0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bab0: 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  P_Commit, 0, 0);
bac0: 0a 20 20 7d 0a 0a 76 61 63 75 75 6d 5f 63 6c 65  .  }..vacuum_cle
bad0: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72  anup:.  sqliteFr
bae0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
baf0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  urn;.}../*.** Be
bb00: 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
bb10: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
bb20: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
bb30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
bb40: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
bb50: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
bb60: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
bb70: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
bb80: 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29   || db->pBe==0 )
bb90: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
bba0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
bbb0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
bbc0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
bbd0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
bbe0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
bbf0: 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73   return;.  v = s
bc00: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
bc10: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
bc20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
bc30: 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
bc40: 61 63 74 69 6f 6e 2c 20 31 2c 20 30 29 3b 0a 20  action, 1, 0);. 
bc50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
bc60: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
bc70: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d  ookie, db->schem
bc80: 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  a_cookie, 0);.  
bc90: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
bca0: 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Verified = 1;.  
bcb0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
bcc0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b   SQLITE_InTrans;
bcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
bce0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
bcf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d  /.void sqliteCom
bd00: 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
bd10: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
bd20: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
bd30: 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
bd40: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
bd50: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
bd60: 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72  | db->pBe==0 ) r
bd70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
bd80: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
bd90: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
bda0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
bdb0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
bdc0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
bdd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20  0 ) return;.  v 
bde0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
bdf0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
be00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
be10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
be20: 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  mmit, 0, 0);.  }
be30: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
be40: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
be50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
be60: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
be70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
be80: 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
be90: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
bea0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
beb0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
bec0: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
bed0: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
bee0: 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30  =0 || db->pBe==0
bef0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
bf00: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
bf10: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
bf20: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
bf30: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
bf40: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
bf50: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
bf60: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
bf70: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
bf80: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
bf90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bfa0: 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30  P_Rollback, 0, 0
bfb0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
bfc0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
bfd0: 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Trans;.}../*.** 
bfe0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
bff0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
c000: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
c010: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
c020: 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29  Boolean(char *z)
c030: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
c040: 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79  *azTrue[] = { "y
c050: 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65  es", "on", "true
c060: 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
c070: 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
c080: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
c090: 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
c0a0: 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
c0b0: 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
c0c0: 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
c0d0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
c0e0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75  ; i<sizeof(azTru
c0f0: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65  e)/sizeof(azTrue
c100: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
c110: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
c120: 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d  p(z,azTrue[i])==
c130: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
c140: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
c150: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
c160: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
c170: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d  t.  .**.** Pragm
c180: 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66  as are of this f
c190: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
c1a0: 50 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75  PRAGMA id = valu
c1b0: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e  e.**.** The iden
c1c0: 74 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73  tifier might als
c1d0: 6f 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20  o be a string.  
c1e0: 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  The value is a s
c1f0: 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64  tring, and.** id
c200: 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e  entifier, or a n
c210: 75 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73  umber.  If minus
c220: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
c230: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a  en the value is.
c240: 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74  ** a number that
c250: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
c260: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
c270: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61  /.void sqlitePra
c280: 67 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  gma(Parse *pPars
c290: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c  e, Token *pLeft,
c2a0: 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20   Token *pRight, 
c2b0: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
c2c0: 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20    char *zLeft = 
c2d0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  0;.  char *zRigh
c2e0: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20  t = 0;.  sqlite 
c2f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c300: 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c  ;..  zLeft = sql
c310: 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74  iteStrNDup(pLeft
c320: 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a  ->z, pLeft->n);.
c330: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
c340: 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69  zLeft);.  if( mi
c350: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a  nusFlag ){.    z
c360: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73  Right = 0;.    s
c370: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
c380: 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c  &zRight, "-", 1,
c390: 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67   pRight->z, pRig
c3a0: 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  ht->n, 0);.  }el
c3b0: 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d  se{.    zRight =
c3c0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
c3d0: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
c3e0: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
c3f0: 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b  Dequote(zRight);
c400: 0a 20 20 7d 0a 20 0a 20 20 69 66 28 20 73 71 6c  .  }. .  if( sql
c410: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
c420: 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d  ,"cache_size")==
c430: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a  0 ){.    int siz
c440: 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29  e = atoi(zRight)
c450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 74 72 65  ;.    sqliteBtre
c460: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
c470: 2d 3e 70 42 65 2c 20 73 69 7a 65 29 3b 0a 20 20  ->pBe, size);.  
c480: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
c490: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
c4a0: 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d  , "vdbe_trace")=
c4b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
c4c0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
c4d0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
c4e0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64  ags |= SQLITE_Vd
c4f0: 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c  beTrace;.    }el
c500: 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
c510: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56  ags &= ~SQLITE_V
c520: 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a  dbeTrace;.    }.
c530: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
c540: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
c550: 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  ft, "full_column
c560: 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20  _names")==0 ){. 
c570: 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
c580: 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
c590: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
c5a0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
c5b0: 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mes;.    }else{.
c5c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
c5d0: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
c5e0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20  olNames;.    }. 
c5f0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
c600: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
c610: 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74 5f 64  t, "result_set_d
c620: 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a 20  etails")==0 ){. 
c630: 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
c640: 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
c650: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
c660: 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74  SQLITE_ResultDet
c670: 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ails;.    }else{
c680: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
c690: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73 75   &= ~SQLITE_Resu
c6a0: 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d  ltDetails;.    }
c6b0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
c6c0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
c6d0: 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61 6e  eft, "count_chan
c6e0: 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ges")==0 ){.    
c6f0: 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
c700: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
c710: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
c720: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20  ITE_CountRows;. 
c730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c740: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
c750: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a  LITE_CountRows;.
c760: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
c770: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
c780: 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74 79  mp(zLeft, "empty
c790: 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b  _result_callback
c7a0: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
c7b0: 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
c7c0: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
c7d0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
c7e0: 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a  E_NullCallback;.
c7f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c800: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
c810: 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
c820: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ck;.    }.  }els
c830: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
c840: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74  trICmp(zLeft, "t
c850: 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29  able_info")==0 )
c860: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
c870: 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  b;.    Vdbe *v;.
c880: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
c890: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
c8a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
c8b0: 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69 74  pTab ) v = sqlit
c8c0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
c8d0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26  ;.    if( pTab &
c8e0: 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61  & v ){.      sta
c8f0: 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65  tic VdbeOp table
c900: 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20  InfoPreface[] = 
c910: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  {.        { OP_C
c920: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20 30  olumnCount, 5, 0
c930: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
c940: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
c950: 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
c960: 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20    "cid"},.      
c970: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
c980: 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
c990: 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20  "name"},.       
c9a0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
c9b0: 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  2, 0,       "
c9c0: 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  type"},.        
c9d0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
c9e0: 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    3, 0,       "n
c9f0: 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20  otnull"},.      
ca00: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
ca10: 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20  e,  4, 0,       
ca20: 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20  "dflt_value"},. 
ca30: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
ca40: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
ca50: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
ca60: 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
ca70: 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
ca80: 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
ca90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
caa0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
cab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
cac0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cad0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
cae0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
caf0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cb00: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
cb10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
cb20: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
cb30: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
cb40: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
cb50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cb60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cb70: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
cb80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
cb90: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
cba0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  , .           pT
cbb0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
cbc0: 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e ? pTab->aCol[i
cbd0: 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22  ].zType : "text"
cbe0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
cbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
cc00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
cc10: 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ger, pTab->aCol[
cc20: 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a  i].notNull, 0);.
cc30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
cc40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
cc50: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
cc60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
cc70: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
cc80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  Tab->aCol[i].zDf
cc90: 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  lt, P3_STATIC);.
cca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
ccb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
ccc0: 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20  llback, 5, 0);. 
ccd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cce0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
ccf0: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
cd00: 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d   "index_info")==
cd10: 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
cd20: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
cd30: 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
cd40: 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73  *v;.    pIdx = s
cd50: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
cd60: 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
cd70: 69 66 28 20 70 49 64 78 20 29 20 76 20 3d 20 73  if( pIdx ) v = s
cd80: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
cd90: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  rse);.    if( pI
cda0: 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  dx && v ){.     
cdb0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
cdc0: 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
cdd0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
cde0: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
cdf0: 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
ce00: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
ce10: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
ce20: 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a        "seqno"},.
ce30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
ce40: 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
ce50: 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
ce60: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
ce70: 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20  nName,  2, 0,   
ce80: 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
ce90: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
cea0: 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  i;.      pTab = 
ceb0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
cec0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ced0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
cee0: 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72  Size(tableInfoPr
cef0: 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66  eface), tableInf
cf00: 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20  oPreface);.     
cf10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
cf20: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
cf30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75  .        int cnu
cf40: 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  m = pIdx->aiColu
cf50: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73  mn[i];.        s
cf60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cf70: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
cf80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
cf90: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cfa0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d  OP_Integer, cnum
cfb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
cfc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cfd0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
cfe0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cff0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d000: 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   -1, pTab->aCol[
d010: 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f  cnum].zName, P3_
d020: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
d030: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d040: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
d050: 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   3, 0);.      }.
d060: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
d070: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
d080: 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78  mp(zLeft, "index
d090: 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  _list")==0 ){.  
d0a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d0b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
d0c0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
d0d0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
d0e0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67  ndTable(db, zRig
d0f0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ht);.    if( pTa
d100: 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73  b ){.      v = s
d110: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
d120: 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78  rse);.      pIdx
d130: 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
d140: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d150: 54 61 62 20 26 26 20 70 49 64 78 20 26 26 20 76  Tab && pIdx && v
d160: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20   ){.      int i 
d170: 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74 61 74  = 0; .      stat
d180: 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78 4c  ic VdbeOp indexL
d190: 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b  istPreface[] = {
d1a0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
d1b0: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c  lumnCount, 3, 0,
d1c0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
d1d0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
d1e0: 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
d1f0: 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20 20   "seq"},.       
d200: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
d210: 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  1, 0,       "
d220: 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  name"},.        
d230: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
d240: 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 75    2, 0,       "u
d250: 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d  nique"},.      }
d260: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ;..      sqliteV
d270: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
d280: 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78 4c  ArraySize(indexL
d290: 69 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e 64  istPreface), ind
d2a0: 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b 0a  exListPreface);.
d2b0: 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64 78        while(pIdx
d2c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d2d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d2e0: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
d2f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
d300: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
d310: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
d320: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d330: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
d340: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
d350: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
d360: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d370: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d380: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
d390: 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20  E_None, 0);.    
d3a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d3b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
d3c0: 63 6b 2c 20 33 2c 20 30 29 3b 0a 09 2b 2b 69 3b  ck, 3, 0);..++i;
d3d0: 0a 09 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70  ..pIdx = pIdx->p
d3e0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
d3f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
d400: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66  ndef NDEBUG.  if
d410: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
d420: 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74  zLeft, "parser_t
d430: 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
d440: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
d450: 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 46  iteParserTrace(F
d460: 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20  ILE*, char *);. 
d470: 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
d480: 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
d490: 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54     sqliteParserT
d4a0: 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61  race(stdout, "pa
d4b0: 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65  rser: ");.    }e
d4c0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
d4d0: 65 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20  eParserTrace(0, 
d4e0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
d4f0: 65 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 7d 0a 20  e.#endif..  {}. 
d500: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
d510: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
d520: 28 7a 52 69 67 68 74 29 3b 0a 7d 0a              (zRight);.}.