/ Hex Artifact Content
Login

Artifact f725dc396d784f723950cf3d47a10f1a69b2f7b7:


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 37 30 20 32 30 30  ild.c,v 1.70 200
0320: 32 2f 30 31 2f 33 31 20 31 35 3a 35 34 3a 32 32  2/01/31 15:54:22
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 61 62 61  temporary databa
3560: 73 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20  se file", 0);.  
3570: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3580: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
3590: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
35a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
35b0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
35c0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
35d0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
35e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
35f0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
3600: 20 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e   name.  Issue an
3610: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
3620: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a  f it does..  **.
3630: 20 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72    ** If we are r
3640: 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e-reading the sq
3650: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
3660: 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73  e because of a s
3670: 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67  chema.  ** chang
3680: 65 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d  e and a new perm
3690: 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66  anent table is f
36a0: 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20  ound whose name 
36b0: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20  collides with.  
36c0: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  ** an existing t
36d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
36e0: 74 68 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20  then ignore the 
36f0: 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  new permanent ta
3700: 62 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c  ble..  ** We wil
3710: 6c 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69  l continue parsi
3720: 6e 67 2c 20 62 75 74 20 74 68 65 20 70 50 61 72  ng, but the pPar
3730: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c  se->nameClash fl
3740: 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20  ag will be set. 
3750: 20 2a 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b   ** so we will k
3760: 6e 6f 77 20 74 6f 20 64 69 73 63 61 72 64 20 74  now to discard t
3770: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
3780: 6f 6e 63 65 20 70 61 72 73 69 6e 67 20 68 61 73  once parsing has
3790: 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a   finished..  */.
37a0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
37b0: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
37c0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
37d0: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ble!=0 ){.    if
37e0: 28 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  ( pTable->isTemp
37f0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
3800: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50  Flag ){.      pP
3810: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20  arse->nameClash 
3820: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
3830: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
3840: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3850: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
3860: 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ", 0, pName->z, 
3870: 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20  pName->n,.      
3880: 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78      " already ex
3890: 69 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20  ists", 0, 0);.  
38a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
38b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Name);.      pPa
38c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
38d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
38e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
38f0: 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20  arse->nameClash 
3900: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  = 0;.  }.  if( (
3910: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e  pIdx = sqliteFin
3920: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
3930: 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  ))!=0 &&.       
3940: 20 20 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c     (!pIdx->pTabl
3950: 65 2d 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50  e->isTemp || !pP
3960: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20  arse->initFlag) 
3970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
3980: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3990: 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20  zErrMsg, "there 
39a0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
39b0: 64 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20  dex named ", .  
39c0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
39d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
39e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
39f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
3a00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
3a10: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
3a20: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
3a30: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
3a40: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
3a50: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3a60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3a70: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
3a80: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
3a90: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
3aa0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
3ab0: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
3ac0: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
3ad0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
3ae0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69  able->isTemp = i
3af0: 73 54 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61  sTemp;.  if( pPa
3b00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
3b10: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
3b20: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  le(db, pParse->p
3b30: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
3b40: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
3b50: 20 70 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 21   pTable;.  if( !
3b60: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
3b70: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47   && (v = sqliteG
3b80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
3b90: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3ba0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
3bb0: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
3bc0: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
3bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
3bf0: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 66 69 6c 65 5f  ookie, db->file_
3c00: 66 6f 72 6d 61 74 2c 20 31 29 3b 0a 20 20 20 20  format, 1);.    
3c10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3c20: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3c30: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
3c40: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
3c50: 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52  P3(v, -1, MASTER
3c60: 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43  _NAME, P3_STATIC
3c70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
3c80: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
3c90: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
3ca0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
3cb0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
3cc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
3cd0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
3ce0: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
3cf0: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
3d00: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
3d10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3d20: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 53 74 61  ment.  sqliteSta
3d30: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
3d40: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
3d50: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
3d60: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
3d70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3d80: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
3d90: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
3da0: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  iteAddColumn(Par
3db0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
3dc0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
3dd0: 6c 65 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 2a  le *p;.  char **
3de0: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
3df0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3e00: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
3e10: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
3e20: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
3e30: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
3e40: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
3e50: 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20  alloc( p->aCol, 
3e60: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
3e70: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
3e80: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
3e90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
3ea0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
3eb0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e   }.  memset(&p->
3ec0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30  aCol[p->nCol], 0
3ed0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
3ee0: 5b 30 5d 29 29 3b 0a 20 20 70 7a 20 3d 20 26 70  [0]));.  pz = &p
3ef0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b  ->aCol[p->nCol++
3f00: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ].zName;.  sqlit
3f10: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
3f20: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3f30: 3e 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  >n, 0);.  sqlite
3f40: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a  Dequote(*pz);.}.
3f50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3f60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3f70: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
3f80: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
3f90: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
3fa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3fb0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
3fc0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
3fd0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
3fe0: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
3ff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4000: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
4010: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
4020: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
4030: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
4040: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4050: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
4060: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
4070: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
4080: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
4090: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
40a0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
40b0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
40c0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 6f  >nCol-1;.  if( o
40d0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
40e0: 6c 74 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f  lt ) onError = O
40f0: 45 5f 41 62 6f 72 74 3b 0a 20 20 69 66 28 20 69  E_Abort;.  if( i
4100: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
4110: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  .notNull = onErr
4120: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
4130: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4140: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
4150: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
4160: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
4170: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
4180: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
4190: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
41a0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
41b0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
41c0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
41d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
41e0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
41f0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
4200: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
4210: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
4220: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
4230: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
4240: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
4250: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
4260: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
4270: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
4280: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
4290: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
42a0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
42b0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
42c0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  / .void sqliteAd
42d0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
42e0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
42f0: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
4300: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
4310: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
4320: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
4330: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 69 66 28   *z, **pz;.  if(
4340: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4350: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4360: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4370: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
4380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
4390: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  = &p->aCol[i].zT
43a0: 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74  ype;.  n = pLast
43b0: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74  ->n + Addr(pLast
43c0: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72  ->z) - Addr(pFir
43d0: 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  st->z);.  sqlite
43e0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
43f0: 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b  First->z, n, 0);
4400: 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66  .  z = *pz;.  if
4410: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
4420: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b  .  for(i=j=0; z[
4430: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  i]; i++){.    in
4440: 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  t c = z[i];.    
4450: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
4460: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
4470: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
4480: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
4490: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
44a0: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
44b0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
44c0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
44d0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
44e0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
44f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
4500: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
4510: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
4520: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
4530: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
4540: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
4550: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
4560: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4570: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
4580: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
4590: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
45a0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
45b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
45c0: 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61  id sqliteAddDefa
45d0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
45e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
45f0: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
4600: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
4610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
4620: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
4630: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4640: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4650: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4660: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4670: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4680: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
4690: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
46a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
46b0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22  tNString(pz, "-"
46c0: 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  , 1, pVal->z, pV
46d0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  al->n, 0);.  }el
46e0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se{.    sqliteSe
46f0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61  tNString(pz, pVa
4700: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
4710: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44  );.  }.  sqliteD
4720: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
4730: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
4740: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
4750: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
4760: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
4770: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
4780: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
4790: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
47a0: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
47b0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
47c0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
47d0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
47e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
47f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
4800: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
4810: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
4820: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
4830: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
4840: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
4850: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
4860: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
4870: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
4880: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
4890: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
48a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
48b0: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
48c0: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
48d0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
48e0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
48f0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
4900: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
4910: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
4920: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
4930: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
4940: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
4950: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
4960: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
4970: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
4980: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
4990: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
49a0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
49b0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
49c0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
49d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
49e0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
49f0: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
4a00: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
4a10: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
4a20: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
4a30: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
4a40: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4a50: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
4a60: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
4a70: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4a80: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
4a90: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
4aa0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
4ab0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
4ac0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
4ad0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
4ae0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72  void sqliteAddPr
4af0: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
4b00: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
4b10: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
4b20: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
4b30: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
4b40: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
4b50: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
4b60: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66   iCol = -1;.  if
4b70: 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
4b80: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rn;.  if( pTab->
4b90: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
4ba0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4bb0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4bc0: 73 67 2c 20 22 74 61 62 6c 65 20 5c 22 22 2c 20  sg, "table \"", 
4bd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
4be0: 20 20 20 20 20 20 22 5c 22 20 68 61 73 20 6d 6f        "\" has mo
4bf0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
4c00: 61 72 79 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20  ary key", 0);.  
4c10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4c20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4c30: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
4c40: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
4c50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
4c60: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
4c70: 6c 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l - 1;.  }else i
4c80: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31  f( pList->nId==1
4c90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c   ){.    for(iCol
4ca0: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
4cb0: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
4cc0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
4cd0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 30  rICmp(pList->a[0
4ce0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
4cf0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
4d00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4d10: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f   }.  }.  if( iCo
4d20: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
4d30: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  b->nCol ){.    z
4d40: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
4d50: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
4d60: 20 7d 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72   }.  if( onError
4d70: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 20 6f  ==OE_Default ) o
4d80: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
4d90: 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  t;.  if( pParse-
4da0: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
4db0: 3e 3d 31 20 26 26 20 0a 20 20 20 20 20 20 20 20  >=1 && .        
4dc0: 20 20 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69     zType && sqli
4dd0: 74 65 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  teStrICmp(zType,
4de0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
4df0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
4e00: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
4e10: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
4e20: 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Error;.  }else{.
4e30: 20 20 20 20 73 71 6c 69 74 65 43 72 65 61 74 65      sqliteCreate
4e40: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
4e50: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
4e60: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  or, 0, 0);.  }.}
4e70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
4e80: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
4e90: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
4ea0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
4eb0: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
4ec0: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
4ed0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
4ee0: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
4ef0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
4f00: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
4f10: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
4f20: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
4f30: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
4f40: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
4f50: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
4f60: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
4f70: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
4f80: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
4f90: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
4fa0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
4fb0: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
4fc0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
4fd0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
4fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
4ff0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
5000: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
5010: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
5020: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
5030: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
5040: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
5050: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
5060: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
5070: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
5080: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
5090: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
50a0: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
50b0: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
50c0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
50d0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
50e0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
50f0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
5100: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
5110: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
5120: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
5130: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
5140: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
5150: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
5160: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
5170: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74   enough..*/.stat
5180: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 43 6f  ic void changeCo
5190: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 29  okie(sqlite *db)
51a0: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
51b0: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68  _cookie==db->sch
51c0: 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20  ema_cookie ){.  
51d0: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
51e0: 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  e = db->schema_c
51f0: 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61  ookie + sqliteRa
5200: 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a  ndomByte() + 1;.
5210: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5220: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
5230: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
5240: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5250: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
5260: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
5270: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
5280: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
5290: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
52a0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
52b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
52c0: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
52d0: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
52e0: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
52f0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
5300: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
5310: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
5320: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
5330: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
5340: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
5350: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
5360: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
5370: 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73  n disk,.** unles
5380: 73 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  s this is a temp
5390: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69  orary table or i
53a0: 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65  nitFlag==1.  Whe
53b0: 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a  n initFlag==1,.*
53c0: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
53d0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
53e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
53f0: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
5400: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
5410: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
5420: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
5430: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
5440: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
5450: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
5460: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
5470: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
5480: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
5490: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
54a0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
54b0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
54c0: 74 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64  t again..*/.void
54d0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
54e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
54f0: 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54  oken *pEnd){.  T
5500: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
5510: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
5520: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d  db;..  if( pEnd=
5530: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
5540: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
5550: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
5560: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
5570: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
5580: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5590: 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  n;..  /* Add the
55a0: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
55b0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
55c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
55d0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
55e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
55f0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c 20 70  ameClash==0 || p
5600: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d  Parse->initFlag=
5610: 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =1 );.  if( pPar
5620: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26  se->explain==0 &
5630: 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  & pParse->nameCl
5640: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  ash==0 ){.    Ta
5650: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  ble *pOld;.    p
5660: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
5670: 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48  Insert(&db->tblH
5680: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
5690: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
56a0: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
56b0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
56c0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
56d0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
56e0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
56f0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
5700: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
5710: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
5720: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
5730: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
5740: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
5750: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5760: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
5770: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
5780: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
5790: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
57a0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
57b0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
57c0: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
57d0: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
57e0: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
57f0: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
5800: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
5810: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
5820: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
5830: 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 70 50  rom the .  ** pP
5840: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
5850: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
5860: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 68 61  number should ha
5870: 76 65 20 62 65 65 6e 20 70 75 74 0a 20 20 2a 2a  ve been put.  **
5880: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
5890: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
58a0: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
58b0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
58c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
58d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
58e0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
58f0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
5900: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
5910: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
5920: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
5930: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5940: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
5950: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
5960: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
5970: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
5980: 2c 20 74 68 65 6e 20 6a 75 73 74 20 63 72 65 61  , then just crea
5990: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 20 20 44  te the table.  D
59a0: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 6d 61 6b 65 20  o not.  ** make 
59b0: 61 6e 20 65 6e 74 72 79 20 69 6e 20 53 51 4c 49  an entry in SQLI
59c0: 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a  TE_MASTER..  */.
59d0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
59e0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
59f0: 6e 74 20 6e 2c 20 61 64 64 72 3b 0a 20 20 20 20  nt n, addr;.    
5a00: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20  Vdbe *v;..    v 
5a10: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
5a20: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
5a30: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
5a40: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
5a50: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
5a60: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
5a70: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  .z) + 1;.    if(
5a80: 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20   !p->isTemp ){. 
5a90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
5ab0: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
5ac0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5ad0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
5ae0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
5af0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
5b00: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
5b10: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
5b20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5b30: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
5b40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
5b50: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
5b60: 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  v, -1, p->zName,
5b70: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
5b80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5b90: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
5ba0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
5bb0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5bc0: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
5bd0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
5be0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
5bf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5c00: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
5c10: 2c 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b  , 0, p->isTemp);
5c20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
5c30: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
5c40: 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75   (char *)&p->tnu
5c50: 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  m, P3_POINTER);.
5c60: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b      p->tnum = 0;
5c70: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54  .    if( !p->isT
5c80: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64  emp ){.      add
5c90: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
5ca0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
5cb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
5cc0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5cd0: 33 28 76 2c 20 61 64 64 72 2c 20 70 50 61 72 73  3(v, addr, pPars
5ce0: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
5cf0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
5d00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5d10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
5d20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5d30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5d40: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
5d50: 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 43  );.      changeC
5d60: 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20 20  ookie(db);.     
5d70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5d80: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
5d90: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
5da0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
5db0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5dc0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
5dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5de0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
5df0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
5e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5e10: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
5e20: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
5e30: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
5e40: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
5e50: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
5e60: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
5e70: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
5e80: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
5e90: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
5ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
5eb0: 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63  oken *pTok){.  c
5ec0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61  har *zName;.  Ta
5ed0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61  ble *pTab;.  zNa
5ee0: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
5ef0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
5f00: 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ok);.  if( zName
5f10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5f20: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
5f30: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
5f40: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  >db, zName);.  s
5f50: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
5f60: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
5f70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
5f80: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
5f90: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
5fa0: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20  ch table: ", 0, 
5fb0: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a  .        pTok->z
5fc0: 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20  , pTok->n, 0);. 
5fd0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5fe0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
5ff0: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pTab;.}../*.** T
6000: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6010: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
6020: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
6030: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6040: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
6050: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6060: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
6070: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
6080: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
6090: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
60a0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
60b0: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
60c0: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  v;.  int base;. 
60d0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
60e0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
60f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
6100: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
6110: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
6120: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6130: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
6140: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
6150: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
6160: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6170: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
6180: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
6190: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
61a0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
61b0: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
61c0: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
61d0: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
61e0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
61f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
6200: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
6210: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
6220: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
6230: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
6240: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
6250: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
6260: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
6270: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
6280: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
6290: 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d  beOp dropTable[]
62a0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
62b0: 4f 70 65 6e 57 72 69 74 65 2c 20 20 30 2c 20 32  OpenWrite,  0, 2
62c0: 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f  ,        MASTER_
62d0: 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  NAME},.      { O
62e0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
62f0: 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20   ADDR(9),  0},. 
6300: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
6310: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
6320: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
6330: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
6340: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
6350: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
6360: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
6370: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
6380: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 4 */.      { O
6390: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
63a0: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
63b0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
63c0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
63d0: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
63e0: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
63f0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
6400: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
6410: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 34 29        0, ADDR(4)
6420: 2c 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20  ,  0}, /* 8 */. 
6430: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
6440: 6b 69 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  kie,  0, 0,     
6450: 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20     0}, /* 9 */. 
6460: 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c       { OP_Close,
6470: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
6480: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
6490: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
64a0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
64b0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
64c0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rse);.    if( !p
64d0: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b  Table->isTemp ){
64e0: 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71  .      base = sq
64f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
6500: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
6510: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
6520: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
6530: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6540: 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c  v, base+2, pTabl
6550: 65 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  e->zName, P3_STA
6560: 54 49 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  TIC);.      chan
6570: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
6580: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6590: 61 6e 67 65 50 31 28 76 2c 20 62 61 73 65 2b 39  angeP1(v, base+9
65a0: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
65b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
65c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
65d0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61   OP_Destroy, pTa
65e0: 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  ble->tnum, pTabl
65f0: 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  e->isTemp);.    
6600: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
6610: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6620: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
6630: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
6640: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
6650: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
6660: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
6670: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
6680: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
6690: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
66a0: 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68   }..  /* Move th
66b0: 65 20 74 61 62 6c 65 20 28 61 6e 64 20 61 6c 6c  e table (and all
66c0: 20 69 74 73 20 69 6e 64 69 63 65 73 29 20 74 6f   its indices) to
66d0: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f   the pending DRO
66e0: 50 20 71 75 65 75 65 2e 0a 20 20 2a 2a 20 4f 72  P queue..  ** Or
66f0: 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 77  , if the table w
6700: 61 73 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74  as never committ
6710: 65 64 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20  ed, just delete 
6720: 69 74 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  it.  If the tabl
6730: 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20  e.  ** has been 
6740: 63 6f 6d 6d 69 74 74 65 64 20 61 6e 64 20 69 73  committed and is
6750: 20 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 70   placed on the p
6760: 65 6e 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75  ending DROP queu
6770: 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
6780: 20 64 65 6c 65 74 65 20 77 69 6c 6c 20 6f 63 63   delete will occ
6790: 75 72 20 77 68 65 6e 20 73 71 6c 69 74 65 43 6f  ur when sqliteCo
67a0: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
67b0: 67 65 73 28 29 20 65 78 65 63 75 74 65 73 2e 0a  ges() executes..
67c0: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
67d0: 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20  ion: if the SQL 
67e0: 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20  statement began 
67f0: 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e  with the EXPLAIN
6800: 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74   keyword,.  ** t
6810: 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73  hen no changes s
6820: 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20  hould be made.. 
6830: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
6840: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
6850: 20 20 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44    sqlitePendingD
6860: 72 6f 70 54 61 62 6c 65 28 64 62 2c 20 70 54 61  ropTable(db, pTa
6870: 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ble);.    db->fl
6880: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
6890: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
68a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
68b0: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
68c0: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
68d0: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
68e0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
68f0: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
6900: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
6910: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
6920: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
6930: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
6940: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
6950: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
6960: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
6970: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
6980: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
6990: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
69a0: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
69b0: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
69c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
69d0: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
69e0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
69f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
6a00: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
6a10: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
6a20: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
6a30: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
6a40: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
6a50: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
6a60: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
6a70: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
6a80: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
6a90: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
6aa0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
6ab0: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
6ac0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
6ad0: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
6ae0: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
6af0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
6b00: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6b10: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
6b20: 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  eCreateIndex(.  
6b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6b40: 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
6b50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
6b60: 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
6b70: 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  *pName,    /* Na
6b80: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
6b90: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
6ba0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
6bb0: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
6bc0: 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65  he table to inde
6bd0: 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e  x.  Use pParse->
6be0: 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
6bf0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  /.  IdList *pLis
6c00: 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
6c10: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
6c20: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
6c30: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a   onError,     /*
6c40: 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
6c50: 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
6c60: 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
6c70: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
6c80: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
6c90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
6ca0: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
6cb0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
6cc0: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
6cd0: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
6ce0: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
6cf0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
6d00: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
6d10: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
6d20: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
6d30: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
6d40: 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65  pIndex;   /* The
6d50: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
6d60: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
6d70: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
6d80: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
6d90: 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20  ullId;          
6da0: 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
6db0: 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
6dc0: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
6dd0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6de0: 64 62 3b 0a 20 20 69 6e 74 20 68 69 64 65 4e 61  db;.  int hideNa
6df0: 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
6e00: 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74 20 74 61  /* Do not put ta
6e10: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6e20: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  hash table */.. 
6e30: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
6e40: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
6e50: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
6e60: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
6e70: 65 78 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f  ex;.  if( onErro
6e80: 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 20  r==OE_Default ) 
6e90: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
6ea0: 72 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  rt;..  /*.  ** F
6eb0: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
6ec0: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
6ed0: 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
6ee0: 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
6ef0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
6f00: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le!=0 ){.    ass
6f10: 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b  ert( pName!=0 );
6f20: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c  .    pTab =  sql
6f30: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
6f40: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
6f50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6f60: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
6f70: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
6f80: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6f90: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  e;.  }.  if( pTa
6fa0: 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
6fb0: 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
6fc0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
6fd0: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
6fe0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
6ff0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
7000: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
7010: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
7020: 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79  me, .      " may
7030: 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e   not have new in
7040: 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 30 29  dices added", 0)
7050: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
7060: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
7070: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7080: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7090: 68 69 73 20 69 6e 64 65 78 20 69 73 20 63 72 65  his index is cre
70a0: 61 74 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65  ated while re-re
70b0: 61 64 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61  ading the schema
70c0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
70d0: 74 65 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65  ter.  ** but the
70e0: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
70f0: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  d with this inde
7100: 78 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  x is a temporary
7110: 20 74 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20   table, it can. 
7120: 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68   ** only mean th
7130: 61 74 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  at the table tha
7140: 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  t this index is 
7150: 72 65 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65  really associate
7160: 64 20 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f  d with is.  ** o
7170: 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73  ne whose name is
7180: 20 68 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61   hidden behind a
7190: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
71a0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
71b0: 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ame..  ** Since 
71c0: 69 74 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  its table has be
71d0: 65 6e 20 73 75 70 70 72 65 73 73 65 64 2c 20 77  en suppressed, w
71e0: 65 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73  e need to also s
71f0: 75 70 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a  uppress the.  **
7200: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
7210: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
7220: 6c 61 67 20 26 26 20 70 54 61 62 2d 3e 69 73 54  lag && pTab->isT
7230: 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  emp ){.    goto 
7240: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
7250: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
7260: 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
7270: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
7280: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
7290: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
72a0: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
72b0: 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
72c0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
72d0: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
72e0: 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
72f0: 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
7300: 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
7310: 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
7320: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
7330: 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
7340: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
7350: 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
7360: 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
7370: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
7380: 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
7390: 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
73a0: 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
73b0: 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
73c0: 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
73d0: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
73e0: 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c  cess this index,
73f0: 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74   but we will not
7400: 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20  .  ** store its 
7410: 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68  name in the hash
7420: 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65   table.  Set the
7430: 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74   hideName flag t
7440: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a  o accomplish.  *
7450: 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  * this..  **.  *
7460: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
7470: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
7480: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
7490: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
74a0: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
74b0: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
74c0: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
74d0: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
74e0: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
74f0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
7500: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
7510: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
7520: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
7530: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
7540: 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
7550: 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
7560: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
7570: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d  ndex */.    zNam
7580: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
7590: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
75a0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
75b0: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
75c0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
75d0: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
75e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
75f0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
7600: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
7610: 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54  ( pISameName->pT
7620: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  able->isTemp && 
7630: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
7640: 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65   ){.        hide
7650: 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Name = 1;.      
7660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7670: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
7680: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
7690: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
76a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  , .           " 
76b0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
76c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
76d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
76e0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
76f0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
7700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7710: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
7720: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
7730: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
7740: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53  ){.      if( pTS
7750: 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20  ameName->isTemp 
7760: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
7770: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
7780: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
7790: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
77b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
77c0: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
77d0: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
77e0: 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  med ",.         
77f0: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
7800: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
7810: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
7820: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
7830: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
7840: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
7850: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
7860: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
7870: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
7880: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
7890: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
78a0: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
78b0: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
78c0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
78d0: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
78e0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
78f0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
7900: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
7910: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
7920: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
7930: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
7940: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
7950: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68  ate_index;.    h
7960: 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ideName = sqlite
7970: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
7980: 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20  ame)!=0;.  }..  
7990: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
79a0: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
79b0: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
79c0: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
79d0: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
79e0: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
79f0: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
7a00: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
7a10: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
7a20: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
7a30: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
7a40: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
7a50: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
7a60: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
7a70: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
7a80: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
7a90: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
7aa0: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
7ab0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
7ac0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
7ad0: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
7ae0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
7af0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
7b00: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
7b10: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
7b20: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
7b30: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
7b40: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
7b50: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
7b60: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
7b70: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
7b90: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
7ba0: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
7bb0: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
7bc0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
7bd0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
7be0: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
7bf0: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
7c00: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
7c10: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
7c20: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
7c30: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
7c40: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
7c50: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
7c60: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
7c70: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
7c80: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
7c90: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  ex->onError = pI
7ca0: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
7cb0: 20 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20   onError;..  /* 
7cc0: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
7cd0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
7ce0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
7cf0: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
7d00: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
7d10: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
7d20: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
7d30: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
7d40: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
7d50: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
7d60: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
7d70: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
7d80: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
7d90: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
7da0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
7db0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
7dc0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
7dd0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
7de0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
7df0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7e00: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
7e10: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
7e20: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
7e30: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
7e40: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
7e50: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
7e60: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
7e70: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
7e80: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
7e90: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
7ea0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
7eb0: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
7ec0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
7ed0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
7ee0: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
7ef0: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
7f00: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
7f10: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
7f20: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
7f30: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
7f40: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
7f50: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
7f60: 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
7f70: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
7f80: 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d  lain && !hideNam
7f90: 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  e ){.    Index *
7fa0: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
7fb0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
7fc0: 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78  >idxHash, pIndex
7fd0: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
7fe0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
7ff0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
8000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
8010: 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
8020: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
8030: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
8040: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
8050: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
8060: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
8070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
8080: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8090: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
80a0: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
80b0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
80c0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
80d0: 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
80e0: 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
80f0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
8100: 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
8110: 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
8120: 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
8130: 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
8140: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
8150: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
8160: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
8170: 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
8180: 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
8190: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
81a0: 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
81b0: 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
81c0: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
81d0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
81e0: 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
81f0: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
8200: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
8210: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
8220: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
8230: 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
8240: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
8250: 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
8260: 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
8270: 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
8280: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
8290: 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
82a0: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
82b0: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
82c0: 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
82d0: 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
82e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
82f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
8300: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
8310: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
8320: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
8330: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
8340: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
8350: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
8360: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
8370: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
8380: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
8390: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
83a0: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ber from the pPa
83b0: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65  rse->newTnum fie
83c0: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ld..  */.  if( p
83d0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
83e0: 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  && pTable!=0 ){.
83f0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
8400: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
8410: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
8420: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
8430: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
8440: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
8450: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
8460: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
8470: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
8480: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
8490: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
84a0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
84b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
84c0: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
84d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46  *.  ** The initF
84e0: 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68  lag is 0 when th
84f0: 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
8500: 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
8510: 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
8520: 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  .  The initFlag 
8530: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
8540: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
8550: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
8560: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
8570: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
8580: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
8590: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
85a0: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
85b0: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
85c0: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
85d0: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
85e0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
85f0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
8600: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
8610: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
8620: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
8630: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
8640: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
8650: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
8660: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
8670: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
8680: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
8690: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
86a0: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
86b0: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
86c0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
86d0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
86e0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
86f0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
8700: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e  e if( pParse->in
8710: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
8720: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
8730: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
8740: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
8750: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
8760: 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70  ;.    int isTemp
8770: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b   = pTab->isTemp;
8780: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
8790: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
87a0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
87b0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
87c0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
87d0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
87e0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
87f0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8800: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
8810: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
8820: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8830: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
8840: 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  te, 0, 2);.     
8850: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
8860: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53  ngeP3(v, -1, MAS
8870: 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41  TER_NAME, P3_STA
8880: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
8890: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54    }.    if( !isT
88a0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
88b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
88c0: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
88d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
88e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
88f0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
8900: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
8910: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
8920: 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
8930: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
8940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8950: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
8960: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
8970: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
8980: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33  Index->zName, P3
8990: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
89a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
89b0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
89c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
89d0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
89e0: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
89f0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
8a00: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
8a10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8a20: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
8a30: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
8a40: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
8a50: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
8a60: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e  har*)&pIndex->tn
8a70: 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  um, P3_POINTER);
8a80: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
8a90: 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  m = 0;.    if( p
8aa0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
8ab0: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
8ac0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
8ae0: 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rAux, 1, 0);.   
8af0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8b10: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
8b20: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
8b30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8b40: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
8b50: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8b60: 7d 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  }.    if( !isTem
8b70: 70 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  p ){.      addr 
8b80: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
8b90: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
8ba0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
8bb0: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
8bc0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 41  ){.        n = A
8bd0: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
8be0: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
8bf0: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
8c00: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
8c10: 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e  , addr, pStart->
8c20: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
8c30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8c40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
8c50: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
8c60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8c70: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
8c80: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
8c90: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  }.    if( pTable
8ca0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8cb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73 54  VdbeAddOp(v, isT
8cc0: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78  emp ? OP_OpenAux
8cd0: 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20 70   : OP_Open, 2, p
8ce0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
8cf0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
8d00: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
8d10: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
8d20: 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20  IC);.      lbl2 
8d30: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
8d40: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
8d50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8d60: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c  v, OP_Rewind, 2,
8d70: 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62   lbl2);.      lb
8d80: 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  l1 = sqliteVdbeA
8d90: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f  ddOp(v, OP_Recno
8da0: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 2, 0);.      f
8db0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
8dc0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
8dd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8de0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
8df0: 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65 78  olumn, 2, pIndex
8e00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a  ->aiColumn[i]);.
8e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8e20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8e30: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20   OP_MakeIdxKey, 
8e40: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c  pIndex->nColumn,
8e50: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8e60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8e70: 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
8e80: 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
8e90: 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  None);.      sql
8ea0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8eb0: 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31  OP_Next, 2, lbl1
8ec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8ed0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8ee0: 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
8ef0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8f00: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20  v, OP_Close, 2, 
8f10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8f30: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
8f40: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
8f50: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  le!=0 ){.      i
8f60: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
8f70: 20 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b        changeCook
8f80: 69 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ie(db);.        
8f90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8fa0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8fb0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
8fc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
8fd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8fe0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
8ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9000: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
9010: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
9020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9030: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
9040: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
9050: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
9060: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
9070: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
9080: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
9090: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
90a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
90b0: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
90c0: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
90d0: 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
90e0: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
90f0: 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
9100: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9110: 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65  d sqliteDropInde
9120: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
9130: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
9140: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
9150: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
9160: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
9170: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
9180: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
9190: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
91a0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
91b0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e  d ) return;.  zN
91c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
91d0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
91e0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
91f0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
9200: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
9210: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
9220: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
9230: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
9240: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
9250: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
9260: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9270: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69  rMsg, "no such i
9280: 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20  ndex: ", 0, .   
9290: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70       pName->z, p
92a0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
92b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
92c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
92d0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
92e0: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
92f0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
9300: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
9310: 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
9320: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
9330: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
9340: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
9350: 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a  dropIndex[] = {.
9360: 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57        { OP_OpenW
9370: 72 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20 20  rite,  0, 2,    
9380: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c     MASTER_NAME},
9390: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
93a0: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
93b0: 31 30 29 2c 30 7d 2c 20 0a 20 20 20 20 20 20 7b  10),0}, .      {
93c0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
93d0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
93e0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 2 */.      { 
93f0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
9400: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
9410: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
9420: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
9430: 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20    0}, /* 4 */.  
9440: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
9450: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
9460: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
9470: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
9480: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
9490: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
94a0: 20 20 20 30 2c 20 41 44 44 52 28 34 29 2c 20 30     0, ADDR(4), 0
94b0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
94c0: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
94d0: 52 28 31 30 29 2c 30 7d 2c 0a 20 20 20 20 20 20  R(10),0},.      
94e0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
94f0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
9500: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 9 */.      {
9510: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
9520: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
9530: 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 10 */.      {
9540: 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20   OP_Close,      
9550: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
9560: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62      };.    int b
9570: 61 73 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ase;.    Table *
9580: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
9590: 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c 69  Table;..    sqli
95a0: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
95b0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
95c0: 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73     if( !pTab->is
95d0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61  Temp ){.      ba
95e0: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
95f0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
9600: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
9610: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
9620: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
9630: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32  angeP3(v, base+2
9640: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
9650: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
9660: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
9670: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
9680: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
9690: 20 62 61 73 65 2b 31 30 2c 20 64 62 2d 3e 6e 65   base+10, db->ne
96a0: 78 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  xt_cookie);.    
96b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
96c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
96d0: 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
96e0: 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29  m, pTab->isTemp)
96f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
9700: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
9710: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
9720: 20 4d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20   Move the index 
9730: 6f 6e 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  onto the pending
9740: 20 44 52 4f 50 20 71 75 65 75 65 2e 20 20 4f 72   DROP queue.  Or
9750: 2c 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  , if the index w
9760: 61 73 0a 20 20 2a 2a 20 6e 65 76 65 72 20 63 6f  as.  ** never co
9770: 6d 6d 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65  mmitted, just de
9780: 6c 65 74 65 20 69 74 2e 20 20 49 6e 64 69 63 65  lete it.  Indice
9790: 73 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  s on the pending
97a0: 20 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a 2a   DROP queue.  **
97b0: 20 67 65 74 20 64 65 6c 65 74 65 64 20 62 79 20   get deleted by 
97c0: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
97d0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 20 77 68  rnalChanges() wh
97e0: 65 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63  en the user exec
97f0: 75 74 65 73 0a 20 20 2a 2a 20 61 20 43 4f 4d 4d  utes.  ** a COMM
9800: 49 54 2e 20 20 4f 72 20 69 66 20 61 20 72 6f 6c  IT.  Or if a rol
9810: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 20 74 68  lback occurs, th
9820: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
9830: 65 20 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a  e DROP queue.  *
9840: 2a 20 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b  * are moved back
9850: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 68   into the main h
9860: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
9870: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
9880: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
9890: 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49  litePendingDropI
98a0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
98b0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
98c0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
98d0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
98e0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
98f0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9900: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9910: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9920: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
9930: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
9940: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
9950: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
9960: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
9970: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
9980: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9990: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
99a0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
99b0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
99c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
99d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
99e0: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
99f0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
9a00: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  st==0 ){.      s
9a10: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
9a20: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
9a30: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9a40: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
9a50: 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29 7b  nExpr & 7)==0 ){
9a60: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
9a70: 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a 20  st->nExpr + 8;. 
9a80: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
9a90: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
9aa0: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
9ab0: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  c(pList->a, n*si
9ac0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
9ad0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
9ae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9af0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
9b00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9b10: 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pList;.    }.   
9b20: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
9b30: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c   }.  if( pExpr |
9b40: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  | pName ){.    i
9b50: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b   = pList->nExpr+
9b60: 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  +;.    pList->a[
9b70: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
9b80: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  ;.    pList->a[i
9b90: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
9ba0: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
9bb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
9bc0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
9bd0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
9be0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
9bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
9c00: 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  uote(pList->a[i]
9c10: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
9c20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
9c30: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
9c40: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
9c50: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
9c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
9c70: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
9c80: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
9c90: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
9ca0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
9cb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
9cc0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
9cd0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
9ce0: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
9cf0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  .pExpr);.    sql
9d00: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
9d10: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
9d20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
9d30: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
9d40: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
9d50: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
9d60: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
9d70: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
9d80: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
9d90: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
9da0: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
9db0: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
9dc0: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
9dd0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
9de0: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
9df0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
9e00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
9e10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
9e20: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
9e30: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
9e40: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
9e50: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
9e60: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
9e70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9e80: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
9e90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9ea0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
9eb0: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
9ec0: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
9ed0: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
9ee0: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
9ef0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
9f00: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
9f10: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
9f20: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
9f30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
9f40: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
9f50: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
9f60: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
9f70: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
9f80: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
9f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
9fa0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
9fb0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
9fc0: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
9fd0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
9fe0: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
9ff0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
a000: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
a010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
a020: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
a030: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
a040: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a050: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
a060: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
a070: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
a080: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
a090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
a0a0: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
a0b0: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
a0c0: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
a0d0: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
a0e0: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
a0f0: 41 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20  AddAlias(IdList 
a100: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
a110: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
a120: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49  ist && pList->nI
a130: 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  d>0 ){.    int i
a140: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20   = pList->nId - 
a150: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
a160: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
a170: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
a180: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
a190: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
a1a0: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
a1b0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
a1c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
a1d0: 65 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69  e an entire IdLi
a1e0: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
a1f0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
a200: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
a210: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
a220: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
a230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
a240: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
a250: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
a260: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
a270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
a280: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
a290: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ias);.    if( pL
a2a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
a2b0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
a2c0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
a2d0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
a2e0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
a2f0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
a300: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
a310: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
a320: 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
a330: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
a340: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
a350: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
a360: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
a370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
a380: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
a390: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
a3a0: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
a3b0: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
a3c0: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
a3d0: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
a3e0: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
a3f0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
a400: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
a410: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
a420: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
a430: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
a440: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
a450: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
a460: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
a470: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
a480: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
a490: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
a4a0: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
a4b0: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
a4c0: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
a4d0: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
a4e0: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
a4f0: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
a500: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
a510: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
a520: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
a530: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
a540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a550: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
a560: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
a570: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
a580: 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  e,   /* The name
a590: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
a5a0: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
a5b0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
a5c0: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
a5d0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
a5e0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
a5f0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
a600: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
a610: 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20  miter,   /* Use 
a620: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
a630: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20  d delimiter */. 
a640: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20   int onError    
a650: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
a660: 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61   do if a constra
a670: 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a  int fails */.){.
a680: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a690: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69   char *zTab;.  i
a6a0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b  nt i;.  Vdbe *v;
a6b0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64  .  int addr, end
a6c0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
a6d0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
a6e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a  pParse->db;..  z
a6f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
a700: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
a710: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66  TableName);.  if
a720: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
a730: 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61 62 3d 3d  failed || zTab==
a740: 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c  0 ) goto copy_cl
a750: 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20  eanup;.  pTab = 
a760: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
a770: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  db, zTab);.  sql
a780: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
a790: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a7a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
a7b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
a7c0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
a7d0: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
a7e0: 20 20 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65        pTableName
a7f0: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
a800: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
a810: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
a820: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
a830: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  p;.  }.  if( pTa
a840: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
a850: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
a860: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
a870: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
a880: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
a890: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
a8a0: 20 6d 6f 64 69 66 69 65 64 22 2c 20 30 29 3b 0a   modified", 0);.
a8b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
a8c0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70  ++;.    goto cop
a8d0: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  y_cleanup;.  }. 
a8e0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
a8f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
a900: 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( v ){.    int o
a910: 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74  penOp;.    sqlit
a920: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
a930: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
a940: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
a950: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
a960: 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a  ileOpen, 0, 0);.
a970: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
a980: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
a990: 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46  pFilename->z, pF
a9a0: 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  ilename->n);.   
a9b0: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
a9c0: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
a9d0: 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62     openOp = pTab
a9e0: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
a9f0: 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65  enWrAux : OP_Ope
aa00: 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69  nWrite;.    sqli
aa10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
aa20: 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e  penOp, 0, pTab->
aa30: 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
aa40: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
aa50: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
aa60: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
aa70: 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d    for(i=1, pIdx=
aa80: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
aa90: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
aaa0: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
aab0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
aac0: 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20  p(v, openOp, i, 
aad0: 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pIdx->tnum);.   
aae0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
aaf0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
ab00: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
ab10: 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
ab20: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
ab30: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
ab40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ab50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ab60: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20  Integer, 0, 0); 
ab70: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
ab80: 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a  he row count */.
ab90: 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20      }.    end = 
aba0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
abb0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72  bel(v);.    addr
abc0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
abd0: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61  Op(v, OP_FileRea
abe0: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65  d, pTab->nCol, e
abf0: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65  nd);.    if( pDe
ac00: 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20  limiter ){.     
ac10: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
ac20: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65  eP3(v, addr, pDe
ac30: 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c  limiter->z, pDel
ac40: 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20  imiter->n);.    
ac50: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
ac60: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
ac70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac80: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
ac90: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74  eP3(v, addr, "\t
aca0: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 1);.    }.   
acb0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
acc0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=0 ){.      sql
acd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ace0: 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70  OP_FileColumn, p
acf0: 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a  Tab->iPKey, 0);.
ad00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ad10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
ad20: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
ad30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
ad40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ad50: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
ad60: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
ad70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
ad80: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
ad90: 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e     if( i==pTab->
ada0: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
adb0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
adc0: 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  primary key colu
add0: 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  mn is filled wit
ade0: 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74 73  h NULL since its
adf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
ae00: 65 20 69 73 20 61 6c 77 61 79 73 20 70 75 6c 6c  e is always pull
ae10: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  ed from the reco
ae20: 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  rd number */.   
ae30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae40: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ae50: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
ae60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ae70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ae80: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
ae90: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   i, 0);.      }.
aea0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
aeb0: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
aec0: 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c  ntChecks(pParse,
aed0: 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20   pTab, 0, 0, 0, 
aee0: 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72  0, onError, addr
aef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d  );.    sqliteCom
af00: 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70  pleteInsertion(p
af10: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
af20: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
af30: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
af40: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29  QLITE_CountRows)
af50: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
af60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
af70: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
af80: 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  ;  /* Increment 
af90: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
afa0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
afb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
afc0: 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20  o, 0, addr);.   
afd0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
afe0: 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b  veLabel(v, end);
aff0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
b000: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
b010: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
b020: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
b030: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
b040: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
b050: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
b060: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
b070: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b080: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
b090: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b0a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b0b0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20  _ColumnName, 0, 
b0c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b0d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
b0e0: 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74  -1, "rows insert
b0f0: 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ed", P3_STATIC);
b100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
b120: 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20  lback, 1, 0);.  
b130: 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f    }.  }.  .copy_
b140: 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75 72  cleanup:.  retur
b150: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n;.}../*.** The 
b160: 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41 43  non-standard VAC
b170: 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  UUM command is u
b180: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
b190: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
b1a0: 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20 73   collapse free s
b1b0: 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20 69  pace, etc.  It i
b1c0: 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65 72  s modelled after
b1d0: 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d   the VACUUM comm
b1e0: 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72  and.** in Postgr
b1f0: 65 53 51 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eSQL..*/.void sq
b200: 6c 69 74 65 56 61 63 75 75 6d 28 50 61 72 73 65  liteVacuum(Parse
b210: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
b220: 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20  *pTableName){.  
b230: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56  char *zName;.  V
b240: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
b250: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b260: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
b270: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
b280: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
b290: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
b2a0: 54 61 62 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20  TableName ){.   
b2b0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
b2c0: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
b2d0: 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  n(pTableName);. 
b2e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
b2f0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
b300: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
b310: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
b320: 61 6d 65 29 3d 3d 30 0a 20 20 20 20 26 26 20 73  ame)==0.    && s
b330: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
b340: 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  b, zName)==0 ){.
b350: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
b360: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
b370: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74  rMsg, "no such t
b380: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 3a 20 22  able or index: "
b390: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
b3a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
b3b0: 0a 20 20 20 20 67 6f 74 6f 20 76 61 63 75 75 6d  .    goto vacuum
b3c0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
b3d0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
b3e0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
b3f0: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 76 61 63   v==0 ) goto vac
b400: 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 73  uum_cleanup;.  s
b410: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
b420: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
b430: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
b440: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
b450: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67  ddOp(v, OP_Reorg
b460: 61 6e 69 7a 65 2c 20 30 2c 20 30 29 3b 0a 20 20  anize, 0, 0);.  
b470: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
b480: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
b490: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
b4a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b4b0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
b4c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
b4d0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b 0a    HashElem *pE;.
b4e0: 20 20 20 20 66 6f 72 28 70 45 3d 73 71 6c 69 74      for(pE=sqlit
b4f0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
b500: 74 62 6c 48 61 73 68 29 3b 20 70 45 3b 20 70 45  tblHash); pE; pE
b510: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
b520: 70 45 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  pE)){.      pTab
b530: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
b540: 61 28 70 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  a(pE);.      sql
b550: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b560: 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30  OP_Reorganize, 0
b570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b580: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
b590: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
b5a0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
b5b0: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
b5c0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
b5d0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b5e0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt){.        sql
b5f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b600: 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30  OP_Reorganize, 0
b610: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
b620: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
b630: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
b640: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
b650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b660: 20 7d 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72   }.  sqliteEndWr
b670: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
b680: 72 73 65 29 3b 0a 0a 76 61 63 75 75 6d 5f 63 6c  rse);..vacuum_cl
b690: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46  eanup:.  sqliteF
b6a0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
b6b0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  turn;.}../*.** B
b6c0: 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
b6d0: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
b6e0: 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  eBeginTransactio
b6f0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
b700: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
b710: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
b720: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
b730: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
b740: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
b750: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
b760: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
b770: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
b780: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
b790: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
b7a0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
b7b0: 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  s ) return;.  sq
b7c0: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
b7d0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
b7e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
b7f0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
b800: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
b810: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
b820: 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
b830: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
b840: 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73  qliteCommitTrans
b850: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
b860: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
b870: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  *db;..  if( pPar
b880: 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
b890: 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
b8a0: 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75  b->pBe==0 ) retu
b8b0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
b8c0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
b8d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
b8e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
b8f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
b900: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
b910: 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 66   return;.  db->f
b920: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
b930: 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74  InTrans;.  sqlit
b940: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
b950: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62  on(pParse);.  db
b960: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44  ->onError = OE_D
b970: 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  efault;.}../*.**
b980: 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
b990: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
b9a0: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72  sqliteRollbackTr
b9b0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
b9c0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
b9d0: 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
b9e0: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
b9f0: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
ba00: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
ba10: 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  >pBe==0 ) return
ba20: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
ba30: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
ba40: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
ba50: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
ba60: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
ba70: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72  _InTrans)==0 ) r
ba80: 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c  eturn;.  v = sql
ba90: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
baa0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
bab0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
bac0: 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63  Op(v, OP_Rollbac
bad0: 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  k, 0, 0);.  }.  
bae0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
baf0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
bb00: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  db->onError = OE
bb10: 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  _Default;.}../*.
bb20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
bb30: 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
bb40: 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
bb50: 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
bb60: 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
bb70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
bb80: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
bb90: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
bba0: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  saction,.** then
bbb0: 20 74 68 69 73 20 73 65 74 73 20 61 20 63 68 65   this sets a che
bbc0: 63 6b 70 6f 69 6e 74 2e 20 20 49 66 20 77 65 20  ckpoint.  If we 
bbd0: 61 72 65 20 6e 6f 74 20 69 6e 20 61 20 74 72 61  are not in a tra
bbe0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a  nsaction, then.*
bbf0: 2a 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  * start a transa
bc00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
bc10: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
bc20: 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
bc30: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
bc40: 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
bc50: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
bc60: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
bc70: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
bc80: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
bc90: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
bca0: 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 56  {.    /* sqliteV
bcb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
bcc0: 68 65 63 6b 50 6f 69 6e 74 2c 20 30 2c 20 30 29  heckPoint, 0, 0)
bcd0: 3b 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ; */.  }else{.  
bce0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bcf0: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
bd00: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ion, 0, 0);.    
bd10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
bd20: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
bd30: 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ie, pParse->db->
bd40: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
bd50: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73  );.    pParse->s
bd60: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20  chemaVerified = 
bd70: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
bd80: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
bd90: 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20  at concludes an 
bda0: 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d  operation that m
bdb0: 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a  ay have changed.
bdc0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
bdd0: 20 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70    This is a comp
bde0: 61 6e 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  anion function t
bdf0: 6f 20 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  o BeginWriteOper
be00: 61 74 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20 61  ation()..** If a
be10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
be20: 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 63   started, then c
be30: 6f 6d 6d 69 74 20 69 74 2e 20 20 49 66 20 61 20  ommit it.  If a 
be40: 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 0a 2a  checkpoint was.*
be50: 2a 20 73 74 61 72 74 65 64 20 74 68 65 6e 20 63  * started then c
be60: 6f 6d 6d 69 74 20 74 68 61 74 2e 0a 2a 2f 0a 76  ommit that..*/.v
be70: 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69  oid sqliteEndWri
be80: 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
be90: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
bea0: 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
beb0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
bec0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
bed0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
bee0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
bef0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
bf00: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 4e  s ){.    /* Do N
bf10: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73  othing */.  }els
bf20: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
bf30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
bf40: 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 0, 0);.  }.
bf50: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  }.../*.** Interp
bf60: 72 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  ret the given st
bf70: 72 69 6e 67 20 61 73 20 61 20 62 6f 6f 6c 65 61  ring as a boolea
bf80: 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  n value..*/.stat
bf90: 69 63 20 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61  ic int getBoolea
bfa0: 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74  n(char *z){.  st
bfb0: 61 74 69 63 20 63 68 61 72 20 2a 61 7a 54 72 75  atic char *azTru
bfc0: 65 5b 5d 20 3d 20 7b 20 22 79 65 73 22 2c 20 22  e[] = { "yes", "
bfd0: 6f 6e 22 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20  on", "true" };. 
bfe0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b   int i;.  if( z[
bff0: 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  0]==0 ) return 0
c000: 3b 0a 20 20 69 66 28 20 69 73 64 69 67 69 74 28  ;.  if( isdigit(
c010: 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d  z[0]) || (z[0]==
c020: 27 2d 27 20 26 26 20 69 73 64 69 67 69 74 28 7a  '-' && isdigit(z
c030: 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72 65 74  [1])) ){.    ret
c040: 75 72 6e 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d  urn atoi(z);.  }
c050: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
c060: 7a 65 6f 66 28 61 7a 54 72 75 65 29 2f 73 69 7a  zeof(azTrue)/siz
c070: 65 6f 66 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20  eof(azTrue[0]); 
c080: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
c090: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a  liteStrICmp(z,az
c0a0: 54 72 75 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65  True[i])==0 ) re
c0b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
c0c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c0d0: 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d   Process a pragm
c0e0: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  a statement.  .*
c0f0: 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65  *.** Pragmas are
c100: 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a   of this form:.*
c110: 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41  *.**      PRAGMA
c120: 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a   id = value.**.*
c130: 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72  * The identifier
c140: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
c150: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61   string.  The va
c160: 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c  lue is a string,
c170: 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69   and.** identifi
c180: 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e  er, or a number.
c190: 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69    If minusFlag i
c1a0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
c1b0: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e   value is.** a n
c1c0: 75 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70  umber that was p
c1d0: 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e  receded by a min
c1e0: 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64  us sign..*/.void
c1f0: 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28 50 61   sqlitePragma(Pa
c200: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
c210: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
c220: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6d 69   *pRight, int mi
c230: 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68 61 72  nusFlag){.  char
c240: 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63   *zLeft = 0;.  c
c250: 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b  har *zRight = 0;
c260: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
c270: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a  pParse->db;..  z
c280: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53 74 72  Left = sqliteStr
c290: 4e 44 75 70 28 70 4c 65 66 74 2d 3e 7a 2c 20 70  NDup(pLeft->z, p
c2a0: 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Left->n);.  sqli
c2b0: 74 65 44 65 71 75 6f 74 65 28 7a 4c 65 66 74 29  teDequote(zLeft)
c2c0: 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61  ;.  if( minusFla
c2d0: 67 20 29 7b 0a 20 20 20 20 7a 52 69 67 68 74 20  g ){.    zRight 
c2e0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  = 0;.    sqliteS
c2f0: 65 74 4e 53 74 72 69 6e 67 28 26 7a 52 69 67 68  etNString(&zRigh
c300: 74 2c 20 22 2d 22 2c 20 31 2c 20 70 52 69 67 68  t, "-", 1, pRigh
c310: 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c  t->z, pRight->n,
c320: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
c330: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
c340: 65 53 74 72 4e 44 75 70 28 70 52 69 67 68 74 2d  eStrNDup(pRight-
c350: 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a  >z, pRight->n);.
c360: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
c370: 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  e(zRight);.  }. 
c380: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
c390: 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63 68  ICmp(zLeft,"cach
c3a0: 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  e_size")==0 ){. 
c3b0: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74     int size = at
c3c0: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
c3d0: 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61  sqliteBtreeSetCa
c3e0: 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c  cheSize(db->pBe,
c3f0: 20 73 69 7a 65 29 3b 0a 20 20 7d 65 6c 73 65 0a   size);.  }else.
c400: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
c410: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76 64 62  ICmp(zLeft, "vdb
c420: 65 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a  e_trace")==0 ){.
c430: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
c440: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
c450: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
c460: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
c470: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
c480: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
c490: 20 7e 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61   ~SQLITE_VdbeTra
c4a0: 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ce;.    }.  }els
c4b0: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
c4c0: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66  trICmp(zLeft, "f
c4d0: 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ull_column_names
c4e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
c4f0: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
c500: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
c510: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
c520: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
c530: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c540: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
c550: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
c560: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
c570: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
c580: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65  rICmp(zLeft, "re
c590: 73 75 6c 74 5f 73 65 74 5f 64 65 74 61 69 6c 73  sult_set_details
c5a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
c5b0: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
c5c0: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
c5d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
c5e0: 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a  _ResultDetails;.
c5f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c600: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
c610: 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61  QLITE_ResultDeta
c620: 69 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ils;.    }.  }el
c630: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
c640: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
c650: 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d  count_changes")=
c660: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
c670: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
c680: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
c690: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f  ags |= SQLITE_Co
c6a0: 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c  untRows;.    }el
c6b0: 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
c6c0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43  ags &= ~SQLITE_C
c6d0: 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a  ountRows;.    }.
c6e0: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
c6f0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
c700: 66 74 2c 20 22 65 6d 70 74 79 5f 72 65 73 75 6c  ft, "empty_resul
c710: 74 5f 63 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30  t_callbacks")==0
c720: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
c730: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
c740: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
c750: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c  s |= SQLITE_Null
c760: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65  Callback;.    }e
c770: 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
c780: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
c790: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  NullCallback;.  
c7a0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
c7b0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
c7c0: 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65 5f 69  (zLeft, "table_i
c7d0: 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfo")==0 ){.    
c7e0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
c7f0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54   Vdbe *v;.    pT
c800: 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
c810: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29  able(db, zRight)
c820: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
c830: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
c840: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
c850: 69 66 28 20 70 54 61 62 20 26 26 20 76 20 29 7b  if( pTab && v ){
c860: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64  .      static Vd
c870: 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72  beOp tableInfoPr
c880: 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eface[] = {.    
c890: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
c8a0: 6f 75 6e 74 2c 20 35 2c 20 30 2c 20 20 20 20 20  ount, 5, 0,     
c8b0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20    0},.        { 
c8c0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
c8d0: 30 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69 64  0, 0,       "cid
c8e0: 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
c8f0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c  _ColumnName,  1,
c900: 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22   0,       "name"
c910: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
c920: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20  ColumnName,  2, 
c930: 30 2c 20 20 20 20 20 20 20 22 74 79 70 65 22 7d  0,       "type"}
c940: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
c950: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 33 2c 20 30  olumnName,  3, 0
c960: 2c 20 20 20 20 20 20 20 22 6e 6f 74 6e 75 6c 6c  ,       "notnull
c970: 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
c980: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c  _ColumnName,  4,
c990: 20 30 2c 20 20 20 20 20 20 20 22 64 66 6c 74 5f   0,       "dflt_
c9a0: 76 61 6c 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d  value"},.      }
c9b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
c9c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c9d0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
c9e0: 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50  ySize(tableInfoP
c9f0: 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e  reface), tableIn
ca00: 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20  foPreface);.    
ca10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
ca20: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
ca30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ca40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ca50: 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
ca60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ca70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ca80: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
ca90: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
caa0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
cab0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
cac0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
cad0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
cae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
caf0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
cb00: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
cb10: 67 65 50 33 28 76 2c 20 2d 31 2c 20 0a 20 20 20  geP3(v, -1, .   
cb20: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
cb30: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3f 20 70 54  ol[i].zType ? pT
cb40: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
cb50: 65 20 3a 20 22 74 65 78 74 22 2c 20 50 33 5f 53  e : "text", P3_S
cb60: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
cb70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cb80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
cb90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
cba0: 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Null, 0);.      
cbb0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cbc0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
cbd0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
cbe0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
cbf0: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61  3(v, -1, pTab->a
cc00: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33  Col[i].zDflt, P3
cc10: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
cc20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cc30: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
cc40: 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 5, 0);.      }
cc50: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
cc60: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
cc70: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
cc80: 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20  x_info")==0 ){. 
cc90: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
cca0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
ccb0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
ccc0: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46    pIdx = sqliteF
ccd0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69  indIndex(db, zRi
cce0: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ght);.    if( pI
ccf0: 64 78 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47  dx ) v = sqliteG
cd00: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
cd10: 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
cd20: 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  v ){.      stati
cd30: 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e  c VdbeOp tableIn
cd40: 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  foPreface[] = {.
cd50: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
cd60: 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20  umnCount, 3, 0, 
cd70: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
cd80: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
cd90: 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
cda0: 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20  "seqno"},.      
cdb0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
cdc0: 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
cdd0: 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20  "cid"},.        
cde0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
cdf0: 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    2, 0,       "n
ce00: 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  ame"},.      };.
ce10: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
ce20: 20 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e     pTab = pIdx->
ce30: 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71  pTable;.      sq
ce40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
ce50: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74  t(v, ArraySize(t
ce60: 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
ce70: 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  , tableInfoPrefa
ce80: 63 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ce);.      for(i
ce90: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
cea0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
ceb0: 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49     int cnum = pI
cec0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
ced0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
cee0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cef0: 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
cf00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
cf10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
cf20: 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a  eger, cnum, 0);.
cf30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
cf40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
cf50: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
cf60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
cf70: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
cf80: 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e  Tab->aCol[cnum].
cf90: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
cfa0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cfb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cfc0: 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29  _Callback, 3, 0)
cfd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cfe0: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
cff0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
d000: 66 74 2c 20 22 69 6e 64 65 78 5f 6c 69 73 74 22  ft, "index_list"
d010: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
d020: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62  x *pIdx;.    Tab
d030: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64  le *pTab;.    Vd
d040: 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20  be *v;.    pTab 
d050: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
d060: 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20  e(db, zRight);. 
d070: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
d080: 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47       v = sqliteG
d090: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d0a0: 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 54 61        pIdx = pTa
d0b0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  b->pIndex;.    }
d0c0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26  .    if( pTab &&
d0d0: 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20   pIdx && v ){.  
d0e0: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a      int i = 0; .
d0f0: 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62        static Vdb
d100: 65 4f 70 20 69 6e 64 65 78 4c 69 73 74 50 72 65  eOp indexListPre
d110: 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  face[] = {.     
d120: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
d130: 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20  unt, 3, 0,      
d140: 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f   0},.        { O
d150: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
d160: 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65 71 22  , 0,       "seq"
d170: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
d180: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20  ColumnName,  1, 
d190: 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d  0,       "name"}
d1a0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
d1b0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30  olumnName,  2, 0
d1c0: 2c 20 20 20 20 20 20 20 22 75 6e 69 71 75 65 22  ,       "unique"
d1d0: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20  },.      };..   
d1e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d1f0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
d200: 69 7a 65 28 69 6e 64 65 78 4c 69 73 74 50 72 65  ize(indexListPre
d210: 66 61 63 65 29 2c 20 69 6e 64 65 78 4c 69 73 74  face), indexList
d220: 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20  Preface);.      
d230: 77 68 69 6c 65 28 70 49 64 78 29 7b 0a 20 20 20  while(pIdx){.   
d240: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d250: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
d260: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
d270: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d280: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
d290: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
d2a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
d2b0: 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e  P3(v, -1, pIdx->
d2c0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
d2d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d2e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d2f0: 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e  _Integer, pIdx->
d300: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
d310: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
d320: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d330: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c   OP_Callback, 3,
d340: 20 30 29 3b 0a 09 2b 2b 69 3b 0a 09 70 49 64 78   0);..++i;..pIdx
d350: 20 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a   = pIdx->pNext;.
d360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d370: 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e  }else..#ifndef N
d380: 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
d390: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
d3a0: 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22 29   "parser_trace")
d3b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
d3c0: 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61 72  n void sqlitePar
d3d0: 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20  serTrace(FILE*, 
d3e0: 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66 28  char *);.    if(
d3f0: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
d400: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ht) ){.      sql
d410: 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 73  iteParserTrace(s
d420: 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20  tdout, "parser: 
d430: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
d440: 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65       sqliteParse
d450: 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20  rTrace(0, 0);.  
d460: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
d470: 69 66 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74  if..  {}.  sqlit
d480: 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20  eFree(zLeft);.  
d490: 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68  sqliteFree(zRigh
d4a0: 74 29 3b 0a 7d 0a                                t);.}.