/ Hex Artifact Content
Login

Artifact bf8456b56011bb3761f11ff4a14121cfbbbd78da:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 65 78 70 72 65    creating expre
0290: 73 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69  ssions and ID li
02a0: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02b0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02c0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02d0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02e0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02f0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
0300: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0310: 69 6c 64 2e 63 2c 76 20 31 2e 36 35 20 32 30 30  ild.c,v 1.65 200
0320: 32 2f 30 31 2f 32 32 20 30 33 3a 31 33 3a 34 32  2/01/22 03:13:42
0330: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0340: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0350: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0360: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0380: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0390: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
03a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
03b0: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
03c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
03d0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
03e0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
03f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
0400: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
0410: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
0420: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
0430: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0440: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0450: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0460: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0470: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0480: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0490: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
04a0: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
04b0: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
04c0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
04d0: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
04e0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
04f0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
0500: 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65 20  qliteExec(Parse 
0510: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0530: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
0540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0550: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0560: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
0580: 64 62 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  dbe && pParse->n
0590: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Err==0 ){.    if
05a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
05b0: 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
05c0: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70  sqliteVdbeList(p
05d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
05e0: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
05f0: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0620: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49   }else{.      FI
0640: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0650: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0660: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0670: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0680: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0690: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
06a0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72   trace);.      r
06b0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78  c = sqliteVdbeEx
06c0: 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ec(pParse->pVdbe
06d0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
06e0: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
06f0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
0720: 64 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20  db->pBusyArg,.  
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73          db->xBus
0750: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
0760: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0780: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
0790: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56  elete(pParse->pV
07a0: 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  dbe);.    pParse
07b0: 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20  ->pVdbe = 0;.   
07c0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
07d0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  sSet = 0;.    pP
07e0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
07f0: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
0800: 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20  aVerified = 0;. 
0810: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0820: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0830: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0840: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0850: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
0860: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
0870: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0880: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0890: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
08a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
08b0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
08c0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
08d0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
08e0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
08f0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0900: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0910: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0920: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0930: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0940: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0950: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0960: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0970: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0980: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  eExprDelete(pLef
0990: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  t);.    sqliteEx
09a0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
09b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
09c0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
09d0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
09e0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
09f0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
0a00: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
0a10: 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  n ){.    pNew->t
0a20: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
0a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0a40: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b  w->token.z = "";
0a50: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0a60: 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .n = 0;.  }.  if
0a70: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
0a80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  t ){.    sqliteE
0a90: 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70  xprSpan(pNew, &p
0aa0: 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69  Left->span, &pRi
0ab0: 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65  ght->span);.  }e
0ac0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  lse{.    pNew->s
0ad0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
0ae0: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
0af0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pNew;.}../*.** S
0b00: 65 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  et the Expr.toke
0b10: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
0b20: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
0b30: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
0b40: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
0b50: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
0b60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0b70: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
0b80: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
0b90: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
0ba0: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  t){.  if( pExpr 
0bb0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
0bc0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
0bd0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e  .    pExpr->span
0be0: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
0bf0: 20 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29   Addr(pRight->z)
0c00: 20 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a   - Addr(pLeft->z
0c10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0c20: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
0c30: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
0c40: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
0c50: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
0c60: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
0c70: 70 72 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75  pr *sqliteExprFu
0c80: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
0c90: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
0ca0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
0cb0: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
0cc0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0cd0: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
0ce0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0cf0: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
0d00: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
0d10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
0d20: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0d30: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
0d40: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
0d50: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
0d60: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
0d70: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
0d80: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
0d90: 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20  token.z = "";.  
0da0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20    pNew->token.n 
0db0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0dc0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0dd0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
0de0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
0df0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
0e00: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
0e10: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
0e20: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
0e30: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 20   of that table. 
0e40: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0e50: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54 61  not found..*/.Ta
0e60: 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64 54  ble *sqliteFindT
0e70: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
0e80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0e90: 20 54 61 62 6c 65 20 2a 70 20 3d 20 73 71 6c 69   Table *p = sqli
0ea0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
0eb0: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
0ec0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
0ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
0ee0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
0ef0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
0f00: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
0f10: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
0f20: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
0f30: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
0f40: 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  at index..** Ret
0f50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0f60: 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  found..*/.Index 
0f70: 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78  *sqliteFindIndex
0f80: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61  (sqlite *db, cha
0f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  r *zName){.  Ind
0fa0: 65 78 20 2a 70 20 3d 20 73 71 6c 69 74 65 48 61  ex *p = sqliteHa
0fb0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0fc0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0fd0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0fe0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0ff0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1000: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1010: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1020: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1030: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1040: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1050: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1060: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1070: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1080: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1090: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
10a0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
10b0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
10c0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
10d0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
10e0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
10f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1100: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1110: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
1120: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
1130: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
1140: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
1150: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
1160: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
1170: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1180: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
1190: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
11a0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
11b0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
11c0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
11d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
11e0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
11f0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
1200: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
1210: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
1220: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1230: 28 26 64 62 2d 3e 69 64 78 44 72 6f 70 2c 20 70  (&db->idxDrop, p
1240: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1250: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1260: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
1270: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  ven index from i
1280: 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ts table, then r
1290: 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64  emove.** the ind
12a0: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
12b0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
12c0: 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79   free its memory
12d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a  .** structures..
12e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e  */.void sqliteUn
12f0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
1300: 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49  ex(sqlite *db, I
1310: 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
1320: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
1330: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
1340: 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  dex ){.    pInde
1350: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1360: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
1370: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1380: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f  Index *p;.    fo
1390: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
13a0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
13b0: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
13c0: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
13d0: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d  .    if( p && p-
13e0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
13f0: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
1400: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1420: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1430: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  db, pIndex);.}..
1440: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67  /*.** Move the g
1450: 69 76 65 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  iven index to th
1460: 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 49  e pending DROP I
1470: 4e 44 45 58 20 71 75 65 75 65 20 69 66 20 69 74  NDEX queue if it
1480: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d   has.** been com
1490: 6d 69 74 74 65 64 2e 20 20 49 66 20 74 68 69 73  mitted.  If this
14a0: 20 69 6e 64 65 78 20 77 61 73 20 6e 65 76 65 72   index was never
14b0: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14c0: 20 6a 75 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20   just.** delete 
14d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  it..**.** Indice
14e0: 73 20 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  s on the pending
14f0: 20 64 72 6f 70 20 71 75 65 75 65 20 61 72 65 20   drop queue are 
1500: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 61 20 43  deleted when a C
1510: 4f 4d 4d 49 54 20 69 73 0a 2a 2a 20 65 78 65 63  OMMIT is.** exec
1520: 75 74 65 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c  uted.  If a ROLL
1530: 42 41 43 4b 20 6f 63 63 75 72 73 2c 20 74 68 65  BACK occurs, the
1540: 20 69 6e 64 69 63 65 73 20 61 72 65 20 6d 6f 76   indices are mov
1550: 65 64 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20  ed back into.** 
1560: 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 20 68  the main index h
1570: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ash table..*/.st
1580: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1590: 50 65 6e 64 69 6e 67 44 72 6f 70 49 6e 64 65 78  PendingDropIndex
15a0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
15b0: 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70  ex *p){.  if( !p
15c0: 2d 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ->isCommit ){.  
15d0: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
15e0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
15f0: 20 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   p);.  }else{.  
1600: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20    Index *pOld;. 
1610: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
1620: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
1630: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
1640: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
1650: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 20 20 69  me)+1, 0);.    i
1660: 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f  f( pOld!=0 && pO
1670: 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ld!=p ){.      s
1680: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1690: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 4f  &db->idxHash, pO
16a0: 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ld->zName, strle
16b0: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
16c0: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
16d0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
16e0: 65 72 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  ert(&db->idxDrop
16f0: 2c 20 70 2c 20 30 2c 20 70 29 3b 0a 20 20 20 20  , p, 0, p);.    
1700: 70 2d 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 31  p->isDropped = 1
1710: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1720: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
1730: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
1740: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1750: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
1760: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
1770: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
1780: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
1790: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
17a0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
17b0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
17c0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
17d0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
17e0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
17f0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
1800: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
1810: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
1820: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
1830: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
1840: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1850: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 2e 0a  with the table..
1860: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
1870: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1880: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
1890: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
18a0: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
18b0: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
18c0: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
18d0: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
18e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
18f0: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
1900: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
1910: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
1920: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
1930: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1940: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  teDeleteTable(sq
1950: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
1960: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
1970: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
1980: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  ex, *pNext;.  if
1990: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
19a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
19b0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
19c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
19d0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
19e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
19f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1a00: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
1a10: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
1a20: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1a30: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
1a40: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
1a50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
1a60: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
1a70: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
1a80: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1a90: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
1aa0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1ab0: 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
1ac0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
1ad0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
1ae0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
1af0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
1b00: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
1b10: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1b20: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
1b30: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
1b40: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
1b50: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
1b60: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
1b70: 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndices..*/.stati
1b80: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  c void sqliteUnl
1b90: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
1ba0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
1bb0: 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65  ble *p){.  Table
1bc0: 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73 65 72 74   *pOld;.  assert
1bd0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
1be0: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1bf0: 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  sert(&db->tblHas
1c00: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
1c10: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
1c20: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
1c30: 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d  Old==0 || pOld==
1c40: 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73  p );.  sqliteHas
1c50: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
1c60: 44 72 6f 70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  Drop, p, 0, 0);.
1c70: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
1c80: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ble(db, p);.}../
1c90: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 67 69  *.** Move the gi
1ca0: 76 65 6e 20 74 61 62 6c 65 20 74 6f 20 74 68 65  ven table to the
1cb0: 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20 54 41   pending DROP TA
1cc0: 42 4c 45 20 71 75 65 75 65 20 69 66 20 69 74 20  BLE queue if it 
1cd0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 6d 6d  has.** been comm
1ce0: 69 74 74 65 64 2e 20 20 49 66 20 74 68 69 73 20  itted.  If this 
1cf0: 74 61 62 6c 65 20 77 61 73 20 6e 65 76 65 72 20  table was never 
1d00: 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1d10: 6a 75 73 74 0a 2a 2a 20 64 65 6c 65 74 65 20 69  just.** delete i
1d20: 74 2e 20 20 44 6f 20 74 68 65 20 73 61 6d 65 20  t.  Do the same 
1d30: 66 6f 72 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  for all its indi
1d40: 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65  ces..**.** Table
1d50: 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71 75 65   on the drop que
1d60: 75 65 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61  ue are not actua
1d70: 6c 6c 79 20 64 65 6c 65 74 65 64 20 75 6e 74 69  lly deleted unti
1d80: 6c 20 61 20 43 4f 4d 4d 49 54 0a 2a 2a 20 73 74  l a COMMIT.** st
1d90: 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75  atement is execu
1da0: 74 65 64 2e 20 20 49 66 20 61 20 52 4f 4c 4c 42  ted.  If a ROLLB
1db0: 41 43 4b 20 6f 63 63 75 72 73 20 69 6e 73 74 65  ACK occurs inste
1dc0: 61 64 20 6f 66 20 61 20 43 4f 4d 4d 49 54 2c 0a  ad of a COMMIT,.
1dd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  ** then the tabl
1de0: 65 73 20 6f 6e 20 74 68 65 20 64 72 6f 70 20 71  es on the drop q
1df0: 75 65 75 65 20 61 72 65 20 6d 6f 76 65 64 20 62  ueue are moved b
1e00: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ack into the mai
1e10: 6e 0a 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e  n.** hash table.
1e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e30: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
1e40: 70 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64  pTable(sqlite *d
1e50: 62 2c 20 54 61 62 6c 65 20 2a 70 54 62 6c 29 7b  b, Table *pTbl){
1e60: 0a 20 20 69 66 28 20 21 70 54 62 6c 2d 3e 69 73  .  if( !pTbl->is
1e70: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
1e80: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
1e90: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 62  eteTable(db, pTb
1ea0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
1eb0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
1ec0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
1ed0: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 6c   *pNext;.    pOl
1ee0: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1ef0: 73 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  sert(&db->tblHas
1f00: 68 2c 20 70 54 62 6c 2d 3e 7a 4e 61 6d 65 2c 20  h, pTbl->zName, 
1f10: 73 74 72 6c 65 6e 28 70 54 62 6c 2d 3e 7a 4e 61  strlen(pTbl->zNa
1f20: 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 20 20 61 73  me)+1,0);.    as
1f30: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 54 62 6c  sert( pOld==pTbl
1f40: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61   );.    sqliteHa
1f50: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62  shInsert(&db->tb
1f60: 6c 44 72 6f 70 2c 20 70 54 62 6c 2c 20 30 2c 20  lDrop, pTbl, 0, 
1f70: 70 54 62 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70  pTbl);.    for(p
1f80: 49 6e 64 65 78 20 3d 20 70 54 62 6c 2d 3e 70 49  Index = pTbl->pI
1f90: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
1fa0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
1fb0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
1fc0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
1fd0: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
1fe0: 70 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  pIndex(db, pInde
1ff0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  x);.    }.  }.}.
2000: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 6c 6c  ./*.** Check all
2010: 20 54 61 62 6c 65 73 20 61 6e 64 20 49 6e 64 65   Tables and Inde
2020: 78 65 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72  xes in the inter
2030: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 20 61  nal hash table a
2040: 6e 64 20 63 6f 6d 6d 69 74 0a 2a 2a 20 61 6e 79  nd commit.** any
2050: 20 61 64 64 69 74 69 6f 6e 73 20 6f 72 20 64 65   additions or de
2060: 6c 65 74 69 6f 6e 73 20 74 6f 20 74 68 6f 73 65  letions to those
2070: 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2a   hash tables..**
2080: 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69  .** When executi
2090: 6e 67 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ng CREATE TABLE 
20a0: 61 6e 64 20 43 52 45 41 54 45 20 49 4e 44 45 58  and CREATE INDEX
20b0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65   statements, the
20c0: 20 54 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 49 6e   Table.** and In
20d0: 64 65 78 20 73 74 72 75 63 74 75 72 65 73 20 61  dex structures a
20e0: 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  re created and a
20f0: 64 64 65 64 20 74 6f 20 74 68 65 20 68 61 73 68  dded to the hash
2100: 20 74 61 62 6c 65 73 2c 20 62 75 74 0a 2a 2a 20   tables, but.** 
2110: 74 68 65 20 22 69 73 43 6f 6d 6d 69 74 22 20 66  the "isCommit" f
2120: 69 65 6c 64 20 69 73 20 6e 6f 74 20 73 65 74 2e  ield is not set.
2130: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
2140: 65 74 73 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ets those fields
2150: 2e 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74  ..** When execut
2160: 69 6e 67 20 44 52 4f 50 20 54 41 42 4c 45 20 61  ing DROP TABLE a
2170: 6e 64 20 44 52 4f 50 20 49 4e 44 45 58 2c 20 74  nd DROP INDEX, t
2180: 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
2190: 78 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  x structures.** 
21a0: 61 72 65 20 6d 6f 76 65 64 20 6f 75 74 20 6f 66  are moved out of
21b0: 20 74 62 6c 48 61 73 68 20 61 6e 64 20 69 64 78   tblHash and idx
21c0: 48 61 73 68 20 69 6e 74 6f 20 74 62 6c 44 72 6f  Hash into tblDro
21d0: 70 20 61 6e 64 20 69 64 78 44 72 6f 70 2e 20 20  p and idxDrop.  
21e0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
21f0: 64 65 6c 65 74 65 73 20 74 68 65 20 73 74 72 75  deletes the stru
2200: 63 74 75 72 65 20 69 6e 20 74 62 6c 44 72 6f 70  cture in tblDrop
2210: 20 61 6e 64 20 69 64 78 44 72 6f 70 2e 0a 2a 2a   and idxDrop..**
2220: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
2230: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
2240: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f  rnalChanges().*/
2250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
2260: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2270: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2280: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
2290: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
22a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
22b0: 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20  rnChanges)==0 ) 
22c0: 72 65 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 73 63  return;.  db->sc
22d0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62  hema_cookie = db
22e0: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20  ->next_cookie;. 
22f0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2300: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
2310: 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  tblHash); pElem;
2320: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2330: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2340: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65     Table *pTable
2350: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2360: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 70 54  a(pElem);.    pT
2370: 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d  able->isCommit =
2380: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45   1;.  }.  for(pE
2390: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
23a0: 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72 6f 70  rst(&db->tblDrop
23b0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
23c0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
23d0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
23e0: 65 20 2a 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  e *pTable = sqli
23f0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
2410: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
2420: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ble);.  }.  sqli
2430: 74 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  teHashClear(&db-
2440: 3e 74 62 6c 44 72 6f 70 29 3b 0a 20 20 66 6f 72  >tblDrop);.  for
2450: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2460: 68 46 69 72 73 74 28 26 64 62 2d 3e 69 64 78 48  hFirst(&db->idxH
2470: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
2480: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2490: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
24a0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73  ndex *pIndex = s
24b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
24c0: 6c 65 6d 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  lem);.    pIndex
24d0: 2d 3e 69 73 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  ->isCommit = 1;.
24e0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 45    }.  while( (pE
24f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2500: 72 73 74 28 26 64 62 2d 3e 69 64 78 44 72 6f 70  rst(&db->idxDrop
2510: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  ))!=0 ){.    Ind
2520: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71 6c  ex *pIndex = sql
2530: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2540: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e  m);.    sqliteUn
2550: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2560: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2570: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2580: 43 6c 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72  Clear(&db->idxDr
2590: 6f 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  op);.  db->flags
25a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
25b0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
25c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25d0: 20 72 75 6e 73 20 77 68 65 6e 20 6f 6e 65 20 6f   runs when one o
25e0: 72 20 6d 6f 72 65 20 43 52 45 41 54 45 20 54 41  r more CREATE TA
25f0: 42 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44 45  BLE, CREATE INDE
2600: 58 2c 0a 2a 2a 20 44 52 4f 50 20 54 41 42 4c 45  X,.** DROP TABLE
2610: 2c 20 6f 72 20 44 52 4f 50 20 49 4e 44 45 58 20  , or DROP INDEX 
2620: 73 74 61 74 65 6d 65 6e 74 73 20 67 65 74 73 20  statements gets 
2630: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 54 68  rolled back.  Th
2640: 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 73 20 6f  e.** additions o
2650: 72 20 64 65 6c 65 74 69 6f 6e 73 20 6f 66 20 54  r deletions of T
2660: 61 62 6c 65 20 61 6e 64 20 49 6e 64 65 78 20 73  able and Index s
2670: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
2680: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
2690: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 64  h tables are und
26a0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  one..**.** See a
26b0: 6c 73 6f 3a 20 73 71 6c 69 74 65 43 6f 6d 6d 69  lso: sqliteCommi
26c0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
26d0: 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ().*/.void sqlit
26e0: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
26f0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2700: 2a 64 62 29 7b 0a 20 20 48 61 73 68 20 74 6f 44  *db){.  Hash toD
2710: 65 6c 65 74 65 3b 0a 20 20 48 61 73 68 45 6c 65  elete;.  HashEle
2720: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 69 66 28 20  m *pElem;.  if( 
2730: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2740: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2750: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
2760: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
2770: 28 26 74 6f 44 65 6c 65 74 65 2c 20 53 51 4c 49  (&toDelete, SQLI
2780: 54 45 5f 48 41 53 48 5f 50 4f 49 4e 54 45 52 2c  TE_HASH_POINTER,
2790: 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f   0);.  db->next_
27a0: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
27b0: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 66 6f  ema_cookie;.  fo
27c0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c  shFirst(&db->tbl
27e0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
27f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2800: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2810: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20  Table *pTable = 
2820: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2830: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 21  Elem);.    if( !
2840: 70 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74  pTable->isCommit
2850: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2860: 48 61 73 68 49 6e 73 65 72 74 28 26 74 6f 44 65  HashInsert(&toDe
2870: 6c 65 74 65 2c 20 70 54 61 62 6c 65 2c 20 30 2c  lete, pTable, 0,
2880: 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a   pTable);.    }.
2890: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
28a0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
28b0: 26 74 6f 44 65 6c 65 74 65 29 3b 20 70 45 6c 65  &toDelete); pEle
28c0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
28d0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
28e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
28f0: 6c 65 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  le = sqliteHashD
2900: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2910: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2920: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2930: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Table);.  }.  sq
2940: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
2950: 6f 44 65 6c 65 74 65 29 3b 0a 20 20 66 6f 72 28  oDelete);.  for(
2960: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2970: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 44 72  First(&db->tblDr
2980: 6f 70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  op); pElem; pEle
2990: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
29a0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
29b0: 62 6c 65 20 2a 70 4f 6c 64 2c 20 2a 70 20 3d 20  ble *pOld, *p = 
29c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
29d0: 45 6c 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72  Elem);.    asser
29e0: 74 28 20 70 2d 3e 69 73 43 6f 6d 6d 69 74 20 29  t( p->isCommit )
29f0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
2a00: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
2a10: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
2a20: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
2a30: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
2a40: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
2a50: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
2a60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2a70: 43 6c 65 61 72 28 26 64 62 2d 3e 74 62 6c 44 72  Clear(&db->tblDr
2a80: 6f 70 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  op);.  for(pElem
2a90: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2aa0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 20  (&db->idxHash); 
2ab0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2ac0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2ad0: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
2ae0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 48  pIndex = sqliteH
2af0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2b00: 20 20 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d      if( !pIndex-
2b10: 3e 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  >isCommit ){.   
2b20: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2b30: 65 72 74 28 26 74 6f 44 65 6c 65 74 65 2c 20 70  ert(&toDelete, p
2b40: 49 6e 64 65 78 2c 20 30 2c 20 70 49 6e 64 65 78  Index, 0, pIndex
2b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
2b60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2b70: 61 73 68 46 69 72 73 74 28 26 74 6f 44 65 6c 65  ashFirst(&toDele
2b80: 74 65 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  te); pElem; pEle
2b90: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2ba0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
2bb0: 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 73 71  dex *pIndex = sq
2bc0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2bd0: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 55  em);.    sqliteU
2be0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2bf0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
2c00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73  .  }.  sqliteHas
2c10: 68 43 6c 65 61 72 28 26 74 6f 44 65 6c 65 74 65  hClear(&toDelete
2c20: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2c30: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2c40: 64 62 2d 3e 69 64 78 44 72 6f 70 29 3b 20 70 45  db->idxDrop); pE
2c50: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2c60: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2c70: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  ){.    Index *pO
2c80: 6c 64 2c 20 2a 70 20 3d 20 73 71 6c 69 74 65 48  ld, *p = sqliteH
2c90: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2cb0: 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 70  sCommit );.    p
2cc0: 2d 3e 69 73 44 72 6f 70 70 65 64 20 3d 20 30 3b  ->isDropped = 0;
2cd0: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
2ce0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2cf0: 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->idxHash, p->zN
2d00: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
2d10: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
2d20: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2d30: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
2d40: 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43   }.  sqliteHashC
2d50: 6c 65 61 72 28 26 64 62 2d 3e 69 64 78 44 72 6f  lear(&db->idxDro
2d60: 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  p);.  db->flags 
2d70: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2d80: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2d90: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
2da0: 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20   name of a user 
2db0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
2dc0: 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a  rom a token..**.
2dd0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
2de0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74   the name is obt
2df0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2e00: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
2e10: 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  st.** be freed b
2e20: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2e30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
2e40: 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65  *sqliteTableName
2e50: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
2e60: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
2e70: 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  *zName = sqliteS
2e80: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
2e90: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71   pName->n);.  sq
2ea0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d  liteDequote(zNam
2eb0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61  e);.  return zNa
2ec0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  me;.}../*.** Beg
2ed0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
2ee0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
2ef0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
2f00: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
2f10: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
2f20: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
2f30: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
2f40: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
2f50: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
2f60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2f70: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
2f80: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
2f90: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
2fa0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
2fb0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
2fc0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
2fd0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a  ble name.  The.*
2fe0: 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69  * pStart token i
2ff0: 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64  s the CREATE and
3000: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61   pName is the ta
3010: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
3020: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
3030: 20 74 72 75 65 20 69 66 20 74 68 65 20 22 54 45   true if the "TE
3040: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
3050: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
3060: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
3070: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
3080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
3090: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
30a0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
30b0: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
30c0: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
30d0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
30e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
30f0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
3100: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
3110: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
3120: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
3130: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
3140: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
3150: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
3160: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3170: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
3180: 74 68 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62  the sqliteEndTab
3190: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
31a0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
31b0: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
31c0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
31d0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
31e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74  */.void sqliteSt
31f0: 61 72 74 54 61 62 6c 65 28 50 61 72 73 65 20 2a  artTable(Parse *
3200: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3210: 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Start, Token *pN
3220: 61 6d 65 2c 20 69 6e 74 20 69 73 54 65 6d 70 29  ame, int isTemp)
3230: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
3240: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
3250: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
3260: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
3270: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
3280: 62 65 20 2a 76 3b 0a 0a 20 20 70 50 61 72 73 65  be *v;..  pParse
3290: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20  ->sFirstToken = 
32a0: 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65  *pStart;.  zName
32b0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
32c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
32d0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
32e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
32f0: 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67  /* Before trying
3300: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d   to create a tem
3310: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61  porary table, ma
3320: 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65  ke sure the Btre
3330: 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69  e for.  ** holdi
3340: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
3350: 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a  les is open..  *
3360: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  /.  if( isTemp &
3370: 26 20 64 62 2d 3e 70 42 65 54 65 6d 70 3d 3d 30  & db->pBeTemp==0
3380: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
3390: 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e   sqliteBtreeOpen
33a0: 28 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53  (0, 0, MAX_PAGES
33b0: 2c 20 26 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b  , &db->pBeTemp);
33c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
33d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33e0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
33f0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3400: 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  g, "unable to op
3410: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
3420: 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
3430: 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
3440: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
3450: 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20  bles", 0);.     
3460: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
3490: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
34a0: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  InTrans ){.     
34b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
34c0: 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
34d0: 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  pBeTemp);.      
34e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
3500: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
3510: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3520: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
3530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
3540: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
3550: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 62 61 73  temporary datbas
3560: 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20  e file", 0);.   
3570: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
3580: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
3590: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
35a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
35b0: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
35c0: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
35d0: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
35e0: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
35f0: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
3600: 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20  name.  Issue an 
3610: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
3620: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20   it does..  **. 
3630: 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65   ** If we are re
3640: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c  -reading the sql
3650: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3660: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63   because of a sc
3670: 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65  hema.  ** change
3680: 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61   and a new perma
3690: 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f  nent table is fo
36a0: 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63  und whose name c
36b0: 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a  ollides with.  *
36c0: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65  * an existing te
36d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
36e0: 68 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e  hen ignore the n
36f0: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
3700: 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  le..  ** We will
3710: 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e   continue parsin
3720: 67 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73  g, but the pPars
3730: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61  e->nameClash fla
3740: 67 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20  g will be set.  
3750: 2a 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  ** so we will kn
3760: 6f 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68  ow to discard th
3770: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f  e table record o
3780: 6e 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20  nce parsing has 
3790: 66 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20  finished..  */. 
37a0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
37b0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
37c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
37d0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  le!=0 ){.    if(
37e0: 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20   pTable->isTemp 
37f0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
3800: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61  lag ){.      pPa
3810: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d  rse->nameClash =
3820: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
3830: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
3840: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3850: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
3860: 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  , 0, pName->z, p
3870: 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Name->n,.       
3880: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
3890: 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sts", 0, 0);.   
38a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
38b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ame);.      pPar
38c0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
38d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
38e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
38f0: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d  rse->nameClash =
3900: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
3910: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
3920: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
3930: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
3940: 20 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65    (!pIdx->pTable
3950: 2d 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61  ->isTemp || !pPa
3960: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29  rse->initFlag) )
3970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
3980: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3990: 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69  ErrMsg, "there i
39a0: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
39b0: 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20  ex named ", .   
39c0: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
39d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
39e0: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
39f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
3a00: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
3a10: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
3a20: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
3a30: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
3a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3a50: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3a60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3a70: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
3a80: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
3a90: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
3aa0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
3ab0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
3ac0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
3ad0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
3ae0: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73  ble->isTemp = is
3af0: 54 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72  Temp;.  if( pPar
3b00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
3b10: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
3b20: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
3b30: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
3b40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
3b50: 70 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 21 70  pTable;.  if( !p
3b60: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
3b70: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65  && (v = sqliteGe
3b80: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
3b90: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 28 64 62  0 ){.    if( (db
3ba0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3bb0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
3bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3bd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
3be0: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
3bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3c00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
3c10: 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63  fyCookie, db->sc
3c20: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  hema_cookie, 0);
3c30: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73  .      pParse->s
3c40: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20  chemaVerified = 
3c50: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
3c60: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
3c70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3c80: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
3c90: 65 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e, db->file_form
3ca0: 61 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  at, 1);.      sq
3cb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3cc0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
3cd0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
3ce0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3cf0: 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  , -1, MASTER_NAM
3d00: 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  E, P3_STATIC);. 
3d10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3d20: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
3d30: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
3d40: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3d50: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
3d60: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3d70: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3d80: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
3d90: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
3da0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
3db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3dc0: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3dd0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3de0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3df0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3e00: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
3e10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
3e20: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
3e30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
3e40: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
3e50: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
3e60: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3e70: 70 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  p;.  char **pz;.
3e80: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3e90: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3eb0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
3ec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
3ed0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
3ee0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
3ef0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
3f00: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
3f10: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
3f20: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
3f30: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
3f40: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
3f50: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 6f 6c   memset(&p->aCol
3f60: 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69  [p->nCol], 0, si
3f70: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
3f80: 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  );.  pz = &p->aC
3f90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e  ol[p->nCol++].zN
3fa0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  ame;.  sqliteSet
3fb0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e 61 6d  NString(pz, pNam
3fc0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3fd0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  0);.  sqliteDequ
3fe0: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
3ff0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4000: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4010: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4020: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4030: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4040: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4050: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
4060: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
4070: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
4080: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
4090: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
40a0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
40b0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
40c0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
40d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
40e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e  .void sqliteAddN
40f0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
4100: 61 72 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  arse){.  Table *
4110: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
4120: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4130: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4140: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
4150: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
4160: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
4170: 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 7d 0a 0a  notNull = 1;.}..
4180: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4190: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
41a0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
41b0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
41c0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
41d0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
41e0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
41f0: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
4200: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
4210: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
4220: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
4230: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
4240: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
4250: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4260: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4270: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
4280: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
4290: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
42a0: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
42b0: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
42c0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
42d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
42e0: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
42f0: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
4300: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
4310: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
4320: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e   sqliteAddColumn
4330: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
4340: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
4350: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
4360: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4370: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
4380: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a  n;.  char *z, **
4390: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
43a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
43b0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
43c0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
43d0: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
43e0: 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61  rn;.  pz = &p->a
43f0: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 3b 0a 20 20  Col[i].zType;.  
4400: 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41  n = pLast->n + A
4410: 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20  ddr(pLast->z) - 
4420: 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b  Addr(pFirst->z);
4430: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
4440: 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e  ing(pz, pFirst->
4450: 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20  z, n, 0);.  z = 
4460: 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  *pz;.  if( z==0 
4470: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4480: 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  i=j=0; z[i]; i++
4490: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  ){.    int c = z
44a0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73  [i];.    if( iss
44b0: 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e  pace(c) ) contin
44c0: 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  ue;.    z[j++] =
44d0: 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   c;.  }.  z[j] =
44e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
44f0: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20   given token is 
4500: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
4510: 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63  e for the last c
4520: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a  olumn added to.*
4530: 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  * the table curr
4540: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
4550: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d  truction.  If "m
4560: 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75  inusFlag" is tru
4570: 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  e, it.** means t
4580: 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77  he value token w
4590: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
45a0: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a   minus sign..**.
45b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
45c0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
45d0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
45e0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
45f0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4600: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4610: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
4620: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
4630: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4640: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e   Token *pVal, in
4650: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
4660: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
4670: 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  i;.  char **pz;.
4680: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
4690: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
46a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
46b0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
46c0: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
46d0: 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b    pz = &p->aCol[
46e0: 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20  i].zDflt;.  if( 
46f0: 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
4700: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4710: 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56  g(pz, "-", 1, pV
4720: 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20  al->z, pVal->n, 
4730: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
4740: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4750: 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  g(pz, pVal->z, p
4760: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a  Val->n, 0);.  }.
4770: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
4780: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  *pz);.}../*.** D
4790: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
47a0: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
47b0: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
47c0: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
47d0: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
47e0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
47f0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
4800: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
4810: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
4820: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
4830: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
4840: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
4850: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
4860: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
4870: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
4880: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
4890: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
48a0: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
48b0: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
48c0: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
48d0: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
48e0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
48f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
4900: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
4910: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
4920: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
4930: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
4940: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
4950: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
4960: 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20   as the row id. 
4970: 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20   (Exception:.** 
4980: 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
4990: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
49a0: 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73   older databases
49b0: 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
49c0: 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
49d0: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e  format version n
49e0: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
49f0: 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20  an 1.)  Set the 
4a00: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
4a10: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
4a20: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
4a30: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
4a40: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
4a50: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4a60: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
4a70: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
4a80: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
4a90: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
4aa0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
4ab0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
4ac0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
4ad0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
4ae0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
4af0: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
4b00: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
4b10: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
4b20: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4b30: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
4b40: 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65  liteAddPrimaryKe
4b50: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
4b60: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
4b70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
4b80: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4b90: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
4ba0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
4bb0: 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  l = -1;.  if( pT
4bc0: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
4bd0: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
4be0: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
4bf0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4c00: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4c10: 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62  "table \"", pTab
4c20: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
4c30: 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74    "\" has more t
4c40: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
4c50: 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  key", 0);.    pP
4c60: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4c70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4c80: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
4c90: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
4ca0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
4cb0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
4cc0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
4cd0: 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a  List->nId==1 ){.
4ce0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
4cf0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
4d00: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
4d10: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
4d20: 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e  p(pList->a[0].zN
4d30: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
4d40: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
4d50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
4d60: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
4d70: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
4d80: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
4d90: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
4da0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
4db0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4dc0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20  >file_format>=1 
4dd0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  && .           z
4de0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74  Type && sqliteSt
4df0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
4e00: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
4e10: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
4e20: 69 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iCol;.  }else{. 
4e30: 20 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 49     sqliteCreateI
4e40: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
4e50: 30 2c 20 70 4c 69 73 74 2c 20 31 2c 20 30 2c 20  0, pList, 1, 0, 
4e60: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
4e70: 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20   Come up with a 
4e80: 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  new random value
4e90: 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20   for the schema 
4ea0: 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75  cookie.  Make su
4eb0: 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61  re.** the new va
4ec0: 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74  lue is different
4ed0: 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a   from the old..*
4ee0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
4ef0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
4f00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
4f10: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4f20: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
4f30: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
4f40: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
4f50: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
4f60: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
4f70: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
4f80: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
4f90: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
4fa0: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
4fb0: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
4fc0: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
4fd0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
4fe0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
4ff0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
5000: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5010: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
5020: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
5030: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
5040: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
5050: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
5060: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
5070: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
5080: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
5090: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
50a0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
50b0: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
50c0: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
50d0: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
50e0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
50f0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
5100: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
5110: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
5120: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
5130: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
5140: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
5150: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
5160: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
5170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5180: 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71   changeCookie(sq
5190: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
51a0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
51b0: 3d 3d 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  ==db->schema_coo
51c0: 6b 69 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  kie ){.    db->n
51d0: 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ext_cookie = db-
51e0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b  >schema_cookie +
51f0: 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74   sqliteRandomByt
5200: 65 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d  e() + 1;.    db-
5210: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5220: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5230: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
5240: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5250: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
5260: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
5270: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
5280: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5290: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
52a0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
52b0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
52c0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
52d0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
52e0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
52f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
5300: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
5310: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
5320: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
5330: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
5340: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
5350: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
5360: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
5370: 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20  .** unless this 
5380: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
5390: 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67  able or initFlag
53a0: 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46  ==1.  When initF
53b0: 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65  lag==1,.** it me
53c0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
53d0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
53e0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
53f0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
5400: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
5410: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
5420: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
5430: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
5440: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
5450: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
5460: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
5470: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
5480: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
5490: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
54a0: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
54b0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
54c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
54d0: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
54e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
54f0: 45 6e 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  End){.  Table *p
5500: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
5510: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
5520: 69 66 28 20 70 45 6e 64 3d 3d 30 20 7c 7c 20 70  if( pEnd==0 || p
5530: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
5540: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
5550: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
5560: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
5570: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
5580: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
5590: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
55a0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
55b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
55c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
55d0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
55e0: 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73  pParse->nameClas
55f0: 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  h==0 || pParse->
5600: 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  initFlag==1 );. 
5610: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
5620: 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73  lain==0 && pPars
5630: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20  e->nameClash==0 
5640: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
5650: 6c 64 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ld;.    pOld = s
5660: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
5670: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  &db->tblHash, p-
5680: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
5690: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
56a0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
56b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
56c0: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
56d0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
56e0: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
56f0: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
5700: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
5710: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
5720: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
5730: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
5740: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
5750: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
5760: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  es;.  }..  /* If
5770: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
5780: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
5790: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
57a0: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
57b0: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
57c0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
57d0: 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72  k.  So do not wr
57e0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a  ite to the disk.
57f0: 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74    ** again.  Ext
5800: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
5810: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
5820: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
5830: 20 0a 20 20 2a 2a 20 70 50 61 72 73 65 2d 3e 6e   .  ** pParse->n
5840: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
5850: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
5860: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
5870: 20 70 75 74 0a 20 20 2a 2a 20 74 68 65 72 65 20   put.  ** there 
5880: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
5890: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
58a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
58b0: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
58c0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73   p->tnum = pPars
58d0: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
58e0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
58f0: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
5900: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
5910: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
5920: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
5930: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
5940: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
5950: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
5960: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
5970: 41 52 59 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ARY table, then 
5980: 6a 75 73 74 20 63 72 65 61 74 65 20 74 68 65 20  just create the 
5990: 74 61 62 6c 65 2e 20 20 44 6f 20 6e 6f 74 0a 20  table.  Do not. 
59a0: 20 2a 2a 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72   ** make an entr
59b0: 79 20 69 6e 20 53 51 4c 49 54 45 5f 4d 41 53 54  y in SQLITE_MAST
59c0: 45 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ER..  */.  if( !
59d0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
59e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 61   ){.    int n, a
59f0: 64 64 72 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  ddr;.    Vdbe *v
5a00: 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
5a10: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
5a20: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
5a30: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d   return;.    n =
5a40: 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
5a50: 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46   Addr(pParse->sF
5a60: 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  irstToken.z) + 1
5a70: 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73  ;.    if( !p->is
5a80: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
5a90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5aa0: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
5ab0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5ac0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5ad0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
5ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5af0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
5b00: 22 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54  "table", P3_STAT
5b10: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
5b20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5b30: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
5b40: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5b50: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
5b60: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  p->zName, P3_STA
5b70: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
5b80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5b90: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
5ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
5bb0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
5bc0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54   p->zName, P3_ST
5bd0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
5be0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
5bf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
5c00: 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d  eateTable, 0, p-
5c10: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  >isTemp);.    sq
5c20: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5c30: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20  (v, addr, (char 
5c40: 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  *)&p->tnum, P3_P
5c50: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 2d 3e  OINTER);.    p->
5c60: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
5c70: 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  ( !p->isTemp ){.
5c80: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
5c90: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5ca0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
5cb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5cc0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
5cd0: 64 72 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72  dr, pParse->sFir
5ce0: 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  stToken.z, n);. 
5cf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5d00: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
5d10: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
5d20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5d30: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30  dOp(v, OP_Put, 0
5d40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  , 0);.      chan
5d50: 67 65 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20  geCookie(db);.  
5d60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5d70: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
5d80: 6b 69 65 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  kie, db->next_co
5d90: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  okie, 0);.      
5da0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5db0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
5dc0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
5dd0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
5de0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
5df0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5e00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5e10: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
5e20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5e30: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
5e40: 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c  , look up a tabl
5e50: 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65  e with that name
5e60: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
5e70: 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72   leave.** an err
5e80: 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  or for the parse
5e90: 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65  r to find and re
5ea0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61  turn NULL..*/.Ta
5eb0: 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65  ble *sqliteTable
5ec0: 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20  FromToken(Parse 
5ed0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5ee0: 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a  pTok){.  char *z
5ef0: 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70  Name;.  Table *p
5f00: 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  Tab;.  zName = s
5f10: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
5f20: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20  omToken(pTok);. 
5f30: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
5f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62  return 0;.  pTab
5f50: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
5f60: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
5f70: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
5f80: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
5f90: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
5fa0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
5fb0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
5fc0: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
5fd0: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
5fe0: 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b     pTok->z, pTok
5ff0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
6000: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  rse->nErr++;.  }
6010: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
6020: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6030: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6040: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
6050: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
6060: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
6070: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
6080: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
6090: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
60a0: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62  id sqliteDropTab
60b0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
60c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
60d0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
60e0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
60f0: 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  nt base;.  sqlit
6100: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6110: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
6120: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
6130: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
6140: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62  ) return;.  pTab
6150: 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  le = sqliteTable
6160: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
6170: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
6180: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
6190: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  rn;.  if( pTable
61a0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
61b0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
61c0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
61d0: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
61e0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  able->zName, .  
61f0: 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62       " may not b
6200: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
6210: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6220: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
6230: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
6240: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
6250: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
6260: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
6270: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
6280: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
6290: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
62a0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
62b0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
62c0: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
62d0: 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 57 72       { OP_OpenWr
62e0: 69 74 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20  ite,  0, 2,     
62f0: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c     MASTER_NAME},
6300: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
6310: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
6320: 39 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  9),  0},.      {
6330: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
6340: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
6350: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 2 */.      {
6360: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
6370: 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
6380: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
6390: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
63a0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 20 2a 2f       0}, /* 4 */
63b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
63c0: 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  mn,     0, 2,   
63d0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
63e0: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
63f0: 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c  0, ADDR(8),  0},
6400: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
6410: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
6420: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
6430: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
6440: 30 2c 20 41 44 44 52 28 34 29 2c 20 20 30 7d 2c  0, ADDR(4),  0},
6450: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 8 */.      {
6460: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
6470: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
6480: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 9 */.      {
6490: 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20   OP_Close,      
64a0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
64b0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65  .    };.    Inde
64c0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 66 28  x *pIdx;.    if(
64d0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
64e0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
64f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6500: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6510: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
6520: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6530: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6540: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62  VerifyCookie, db
6550: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
6560: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
6570: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
6580: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
6590: 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 73   if( !pTable->is
65a0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 62 61  Temp ){.      ba
65b0: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
65c0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
65d0: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
65e0: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
65f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6600: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32  angeP3(v, base+2
6610: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
6620: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
6630: 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69 65 28     changeCookie(
6640: 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  db);.      sqlit
6650: 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  eVdbeChangeP1(v,
6660: 20 62 61 73 65 2b 39 2c 20 64 62 2d 3e 6e 65 78   base+9, db->nex
6670: 74 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  t_cookie);.    }
6680: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6690: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
66a0: 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d  oy, pTable->tnum
66b0: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
66c0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  );.    for(pIdx=
66d0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
66e0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
66f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 73  >pNext){.      s
6700: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6710: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
6720: 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65  dx->tnum, pTable
6730: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d  ->isTemp);.    }
6740: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
6750: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
6760: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
6770: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6780: 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
6790: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
67a0: 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20  ..  /* Move the 
67b0: 74 61 62 6c 65 20 28 61 6e 64 20 61 6c 6c 20 69  table (and all i
67c0: 74 73 20 69 6e 64 69 63 65 73 29 20 74 6f 20 74  ts indices) to t
67d0: 68 65 20 70 65 6e 64 69 6e 67 20 44 52 4f 50 20  he pending DROP 
67e0: 71 75 65 75 65 2e 0a 20 20 2a 2a 20 4f 72 2c 20  queue..  ** Or, 
67f0: 69 66 20 74 68 65 20 74 61 62 6c 65 20 77 61 73  if the table was
6800: 20 6e 65 76 65 72 20 63 6f 6d 6d 69 74 74 65 64   never committed
6810: 2c 20 6a 75 73 74 20 64 65 6c 65 74 65 20 69 74  , just delete it
6820: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 0a  .  If the table.
6830: 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 6f    ** has been co
6840: 6d 6d 69 74 74 65 64 20 61 6e 64 20 69 73 20 70  mmitted and is p
6850: 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 70 65 6e  laced on the pen
6860: 64 69 6e 67 20 44 52 4f 50 20 71 75 65 75 65 2c  ding DROP queue,
6870: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64   then the.  ** d
6880: 65 6c 65 74 65 20 77 69 6c 6c 20 6f 63 63 75 72  elete will occur
6890: 20 77 68 65 6e 20 73 71 6c 69 74 65 43 6f 6d 6d   when sqliteComm
68a0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
68b0: 73 28 29 20 65 78 65 63 75 74 65 73 2e 0a 20 20  s() executes..  
68c0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
68d0: 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74  n: if the SQL st
68e0: 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69  atement began wi
68f0: 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  th the EXPLAIN k
6900: 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65  eyword,.  ** the
6910: 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f  n no changes sho
6920: 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  uld be made..  *
6930: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
6940: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
6950: 73 71 6c 69 74 65 50 65 6e 64 69 6e 67 44 72 6f  sqlitePendingDro
6960: 70 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  pTable(db, pTabl
6970: 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  e);.    db->flag
6980: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
6990: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
69a0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
69b0: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
69c0: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
69d0: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
69e0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
69f0: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
6a00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6a10: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
6a20: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
6a30: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
6a40: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
6a50: 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
6a60: 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
6a70: 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
6a80: 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
6a90: 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
6aa0: 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
6ab0: 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
6ac0: 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
6ad0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
6ae0: 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
6af0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
6b00: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
6b10: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
6b20: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
6b30: 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
6b40: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
6b50: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
6b60: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
6b70: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
6b80: 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
6b90: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
6ba0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
6bb0: 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
6bc0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6bd0: 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
6be0: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
6bf0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
6c00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
6c10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
6c20: 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
6c30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
6c40: 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
6c50: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
6c60: 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
6c70: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  Name,    /* Name
6c80: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
6c90: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
6ca0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
6cb0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
6cc0: 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   table to index.
6cd0: 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e    Use pParse->pN
6ce0: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
6cf0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c    IdList *pList,
6d00: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
6d10: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
6d20: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
6d30: 73 55 6e 69 71 75 65 2c 20 20 20 20 2f 2a 20 54  sUnique,    /* T
6d40: 72 75 65 20 69 66 20 61 6c 6c 20 65 6e 74 72 69  rue if all entri
6d50: 65 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  es in this index
6d60: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
6d70: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
6d80: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
6d90: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
6da0: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
6db0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
6dc0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
6dd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
6de0: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
6df0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
6e00: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
6e10: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
6e20: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
6e30: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
6e40: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
6e50: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
6e60: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
6e70: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
6e80: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
6e90: 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
6ea0: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
6eb0: 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
6ec0: 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71   ID list */.  sq
6ed0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
6ee0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69 64  e->db;.  int hid
6ef0: 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  eName = 0;      
6f00: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75 74     /* Do not put
6f10: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
6f20: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  he hash table */
6f30: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
6f40: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
6f50: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
6f60: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
6f70: 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  index;..  /*.  *
6f80: 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
6f90: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
6fa0: 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
6fb0: 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
6fc0: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
6fd0: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
6fe0: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30  assert( pName!=0
6ff0: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
7000: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
7010: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61  oken(pParse, pTa
7020: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
7030: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
7040: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
7050: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
7060: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
7070: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
7080: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
7090: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
70a0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
70b0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
70c0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
70d0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
70e0: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
70f0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20  zName, .      " 
7100: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77  may not have new
7110: 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c   indices added",
7120: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7130: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
7140: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
7150: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
7160: 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
7170: 63 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65  created while re
7180: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68  -reading the sch
7190: 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ema from sqlite_
71a0: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20  master.  ** but 
71b0: 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  the table associ
71c0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
71d0: 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72  ndex is a tempor
71e0: 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61  ary table, it ca
71f0: 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e  n.  ** only mean
7200: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
7210: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
7220: 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69  is really associ
7230: 61 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a  ated with is.  *
7240: 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65  * one whose name
7250: 20 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e   is hidden behin
7260: 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  d a temporary ta
7270: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
7280: 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e  e name..  ** Sin
7290: 63 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73  ce its table has
72a0: 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64   been suppressed
72b0: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73  , we need to als
72c0: 6f 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20  o suppress the. 
72d0: 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   ** index..  */.
72e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
72f0: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 2d 3e  itFlag && pTab->
7300: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f  isTemp ){.    go
7310: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
7320: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
7330: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
7340: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
7350: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
7360: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
7370: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
7380: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
7390: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
73a0: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
73b0: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
73c0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
73d0: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
73e0: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
73f0: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
7400: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
7410: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
7420: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
7430: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
7440: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
7450: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
7460: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
7470: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
7480: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
7490: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
74a0: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
74b0: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
74c0: 65 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20  ex, but we will 
74d0: 6e 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69  not.  ** store i
74e0: 74 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68  ts name in the h
74f0: 61 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20  ash table.  Set 
7500: 74 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61  the hideName fla
7510: 67 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a  g to accomplish.
7520: 20 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a    ** this..  **.
7530: 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
7540: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
7550: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
7560: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
7570: 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
7580: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
7590: 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
75a0: 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
75b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
75c0: 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  me ){.    Index 
75d0: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
75e0: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
75f0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
7600: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
7610: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
7620: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
7630: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
7640: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
7650: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
7660: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
7670: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
7680: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
7690: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
76a0: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
76b0: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
76c0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
76d0: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
76e0: 20 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d   if( pISameName-
76f0: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
7700: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
7710: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
7720: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
7730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7740: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
7750: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
7760: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
7770: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
7780: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
7790: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  s", 0);.        
77a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
77b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
77c0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
77d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
77e0: 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d    if( (pTSameNam
77f0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
7800: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  ble(db, zName))!
7810: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7820: 70 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65  pTSameName->isTe
7830: 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  mp && pParse->in
7840: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  itFlag ){.      
7850: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a    hideName = 1;.
7860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7870: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
7880: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
7890: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
78a0: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
78b0: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
78c0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
78d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
78e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
78f0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
7900: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
7910: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
7920: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
7930: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
7940: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
7950: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
7960: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
7970: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
7980: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
7990: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
79a0: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
79b0: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
79c0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
79d0: 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61  &zName, "(", pTa
79e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f  b->zName, " auto
79f0: 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30  index ", zBuf, 0
7a00: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
7a10: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
7a20: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
7a30: 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c    hideName = sql
7a40: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
7a50: 20 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a   zName)!=0;.  }.
7a60: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
7a70: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
7a80: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
7a90: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
7aa0: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
7ab0: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
7ac0: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
7ad0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
7ae0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
7af0: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
7b00: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
7b10: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
7b20: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
7b30: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
7b40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
7b50: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
7b60: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
7b70: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
7b80: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
7b90: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
7ba0: 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
7bb0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
7bc0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
7bd0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
7be0: 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
7bf0: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
7c00: 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
7c10: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
7c20: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
7c30: 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
7c40: 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69   sizeof(int)*pLi
7c70: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
7c80: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
7c90: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
7ca0: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
7cb0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
7cc0: 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49  &pIndex[1];.  pI
7cd0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
7ce0: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
7cf0: 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49  Column[pList->nI
7d00: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
7d10: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
7d20: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
7d30: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
7d40: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
7d50: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70   pList->nId;.  p
7d60: 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20  Index->isUnique 
7d70: 3d 20 69 73 55 6e 69 71 75 65 3b 0a 0a 20 20 2f  = isUnique;..  /
7d80: 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
7d90: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
7da0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
7db0: 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
7dc0: 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
7dd0: 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
7de0: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
7df0: 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
7e00: 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
7e10: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
7e20: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
7e30: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
7e40: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
7e50: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
7e60: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
7e70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
7e80: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
7e90: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
7ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
7eb0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
7ec0: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
7ed0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
7ee0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
7ef0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
7f00: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
7f10: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
7f20: 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  " has no column 
7f30: 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e  named ", pList->
7f40: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  a[i].zName, 0);.
7f50: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
7f60: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  rr++;.      sqli
7f70: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
7f80: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
7f90: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
7fa0: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
7fb0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
7fc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
7fd0: 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
7fe0: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
7ff0: 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
8000: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
8010: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
8020: 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
8030: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
8040: 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e  xplain && !hideN
8050: 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ame ){.    Index
8060: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
8070: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
8080: 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64  b->idxHash, pInd
8090: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
80a0: 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  n(zName)+1, pInd
80b0: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
80c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
80d0: 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
80e0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
80f0: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
8100: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
8110: 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  dex);.      goto
8120: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
8130: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
8140: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
8150: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
8160: 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 70  .  }.  pIndex->p
8170: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
8180: 64 65 78 3b 0a 20 20 70 54 61 62 2d 3e 70 49 6e  dex;.  pTab->pIn
8190: 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 0a 20  dex = pIndex;.. 
81a0: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
81b0: 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e  lag is 1 it mean
81c0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
81d0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
81e0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
81f0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
8200: 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20  he disk.  So do 
8210: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
8220: 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e   disk.  ** again
8230: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74  .  Extract the t
8240: 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  able number from
8250: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77   the pParse->new
8260: 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  Tnum field..  */
8270: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
8280: 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c  nitFlag && pTabl
8290: 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  e!=0 ){.    pInd
82a0: 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73  ex->tnum = pPars
82b0: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
82c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
82d0: 74 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20  tFlag is 0 then 
82e0: 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
82f0: 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
8300: 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
8310: 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
8320: 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
8330: 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
8340: 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
8350: 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
8360: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
8370: 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
8380: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
8390: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
83a0: 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
83b0: 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
83c0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69   command.  The i
83d0: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65  nitFlag is 1 whe
83e0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
83f0: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
8400: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
8410: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
8420: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
8430: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
8440: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
8450: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
8460: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
8470: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
8480: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
8490: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
84a0: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
84b0: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
84c0: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
84d0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
84e0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
84f0: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
8500: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
8510: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8520: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
8530: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
8540: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
8550: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
8560: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
8570: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
8580: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
8590: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
85a0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
85b0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d  arse->initFlag==
85c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  0 ){.    int n;.
85d0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
85e0: 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b   int lbl1, lbl2;
85f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
8600: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e  int addr;.    in
8610: 74 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d  t isTemp = pTab-
8620: 3e 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20 76 20  >isTemp;..    v 
8630: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
8640: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
8650: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
8660: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
8670: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
8680: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
8690: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
86a0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
86b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
86c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
86d0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
86e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
86f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8700: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
8710: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
8720: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  e, 0);.        p
8730: 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72  Parse->schemaVer
8740: 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ified = 1;.     
8750: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69 73   }.      if( !is
8760: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
8770: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8780: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
8790: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20   0, 2);.        
87a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
87b0: 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52  P3(v, -1, MASTER
87c0: 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43  _NAME, P3_STATIC
87d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
87e0: 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70  .    if( !isTemp
87f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8800: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8810: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
8820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8830: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
8840: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
8850: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
8860: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
8870: 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ex", P3_STATIC);
8880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8890: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
88a0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
88b0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
88c0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64  geP3(v, -1, pInd
88d0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ex->zName, P3_ST
88e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
88f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8900: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
8910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8920: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
8930: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
8940: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
8950: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
8960: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8970: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30  P_CreateIndex, 0
8980: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  , isTemp);.    s
8990: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
89a0: 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
89b0: 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  *)&pIndex->tnum,
89c0: 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
89d0: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
89e0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   0;.    if( pTab
89f0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
8a00: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
8a10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8a20: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75  p(v, OP_OpenWrAu
8a30: 78 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  x, 1, 0);.      
8a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8a50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8a60: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
8a70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8a80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
8a90: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
8aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ab0: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
8ac0: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  {.      addr = s
8ad0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8ae0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
8af0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
8b00: 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
8b10: 20 20 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72          n = Addr
8b20: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
8b30: 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31 3b  (pStart->z) + 1;
8b40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8b50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
8b60: 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20  ddr, pStart->z, 
8b70: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
8b80: 20 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 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
8ba0: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 20  rd, 5, 0);.     
8bb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8bc0: 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20 30  (v, OP_Put, 0, 0
8bd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8be0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
8bf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8c00: 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f 50 5f  (v, isTemp ? OP_
8c10: 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65  OpenAux : OP_Ope
8c20: 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  n, 2, pTab->tnum
8c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8c40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
8c50: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
8c60: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
8c70: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
8c80: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
8c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8ca0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
8cb0: 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
8cc0: 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
8cd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8ce0: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
8cf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8d00: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
8d10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8d20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8d30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
8d40: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
8d50: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
8d60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8d70: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
8d80: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
8d90: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
8da0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8db0: 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  p(v, OP_IdxPut, 
8dc0: 31 2c 20 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69  1, pIndex->isUni
8dd0: 71 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  que);.      sqli
8de0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8df0: 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29  P_Next, 2, lbl1)
8e00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8e10: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
8e20: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73  , lbl2);.      s
8e30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8e40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30  , OP_Close, 2, 0
8e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8e60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
8e70: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
8e80: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c   }.    if( pTabl
8e90: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e!=0 ){.      if
8ea0: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
8eb0: 20 20 20 20 20 63 68 61 6e 67 65 43 6f 6f 6b 69       changeCooki
8ec0: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  e(db);.        s
8ed0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8ee0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
8ef0: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c  db->next_cookie,
8f00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
8f10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8f20: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
8f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8f40: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
8f50: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
8f60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
8f70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8f80: 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30   OP_Commit, 0, 0
8f90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8fa0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
8fb0: 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
8fc0: 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
8fd0: 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  e_index:.  sqlit
8fe0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
8ff0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ist);.  sqliteFr
9000: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
9010: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
9020: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9030: 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
9040: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
9050: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
9060: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
9070: 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
9080: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
9090: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
90a0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
90b0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
90c0: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61  x *pIndex;.  cha
90d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
90e0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
90f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9100: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
9110: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
9120: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
9130: 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  turn;.  zName = 
9140: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
9150: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
9160: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
9170: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64  ) return;.  pInd
9180: 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  ex = sqliteFindI
9190: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  ndex(db, zName);
91a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
91b0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ame);.  if( pInd
91c0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
91d0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
91e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
91f0: 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
9200: 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70  ", 0, .        p
9210: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9220: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
9230: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
9240: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
9250: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9260: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
9270: 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
9280: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
9290: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
92a0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
92b0: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
92c0: 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e  ic VdbeOp dropIn
92d0: 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dex[] = {.      
92e0: 7b 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  { OP_OpenWrite, 
92f0: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 4d 41 53   0, 2,       MAS
9300: 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20  TER_NAME},.     
9310: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
9320: 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c 30 7d    0, ADDR(10),0}
9330: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
9340: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
9350: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a        0}, /* 2 *
9360: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
9370: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
9380: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9390: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
93a0: 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
93b0: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 4 */.      { 
93c0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
93d0: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
93e0: 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
93f0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
9400: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
9410: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
9420: 41 44 44 52 28 34 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(4), 0},.   
9430: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
9440: 20 20 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c      0, ADDR(10),
9450: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
9460: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
9470: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20         0}, /* 9 
9480: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  */.      { OP_Se
9490: 74 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 30 2c 20  tCookie,  0, 0, 
94a0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 30 20        0}, /* 10 
94b0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c  */.      { OP_Cl
94c0: 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ose,      0, 0, 
94d0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
94e0: 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  .    int base;. 
94f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
9500: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
9510: 0a 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66  ..    if( (db->f
9520: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
9530: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
9540: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9550: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
9560: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
9570: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9580: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
9590: 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65 6d  ookie, db->schem
95a0: 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  a_cookie, 0);.  
95b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65      pParse->sche
95c0: 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a  maVerified = 1;.
95d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
95e0: 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  Tab->isTemp ){. 
95f0: 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69       base = sqli
9600: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
9610: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
9620: 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
9630: 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
9640: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
9650: 20 62 61 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d   base+2, pIndex-
9660: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
9670: 43 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  C);.      change
9680: 43 6f 6f 6b 69 65 28 64 62 29 3b 0a 20 20 20 20  Cookie(db);.    
9690: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
96a0: 67 65 50 31 28 76 2c 20 62 61 73 65 2b 31 30 2c  geP1(v, base+10,
96b0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
96c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
96d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
96e0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64  OP_Destroy, pInd
96f0: 65 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e  ex->tnum, pTab->
9700: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28  isTemp);.    if(
9710: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
9720: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
9730: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9740: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9750: 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20  Commit, 0, 0);. 
9760: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
9770: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ove the index on
9780: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  to the pending D
9790: 52 4f 50 20 71 75 65 75 65 2e 20 20 4f 72 2c 20  ROP queue.  Or, 
97a0: 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 61 73  if the index was
97b0: 0a 20 20 2a 2a 20 6e 65 76 65 72 20 63 6f 6d 6d  .  ** never comm
97c0: 69 74 74 65 64 2c 20 6a 75 73 74 20 64 65 6c 65  itted, just dele
97d0: 74 65 20 69 74 2e 20 20 49 6e 64 69 63 65 73 20  te it.  Indices 
97e0: 6f 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 20 44  on the pending D
97f0: 52 4f 50 20 71 75 65 75 65 0a 20 20 2a 2a 20 67  ROP queue.  ** g
9800: 65 74 20 64 65 6c 65 74 65 64 20 62 79 20 73 71  et deleted by sq
9810: 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  liteCommitIntern
9820: 61 6c 43 68 61 6e 67 65 73 28 29 20 77 68 65 6e  alChanges() when
9830: 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75 74   the user execut
9840: 65 73 0a 20 20 2a 2a 20 61 20 43 4f 4d 4d 49 54  es.  ** a COMMIT
9850: 2e 20 20 4f 72 20 69 66 20 61 20 72 6f 6c 6c 62  .  Or if a rollb
9860: 61 63 6b 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ack occurs, the 
9870: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
9880: 44 52 4f 50 20 71 75 65 75 65 0a 20 20 2a 2a 20  DROP queue.  ** 
9890: 61 72 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 69  are moved back i
98a0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 68 61 73  nto the main has
98b0: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
98c0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
98d0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
98e0: 74 65 50 65 6e 64 69 6e 67 44 72 6f 70 49 6e 64  tePendingDropInd
98f0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
9900: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9910: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
9920: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
9930: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
9940: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
9950: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
9960: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
9970: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
9980: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
9990: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
99a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
99b0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45 78  prList *sqliteEx
99c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70  prListAppend(Exp
99d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78  rList *pList, Ex
99e0: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
99f0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
9a00: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
9a10: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
9a20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
9a30: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
9a40: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
9a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
9a60: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45  iteExprDelete(pE
9a70: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
9a80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
9a90: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45    if( (pList->nE
9aa0: 78 70 72 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  xpr & 7)==0 ){. 
9ab0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
9ac0: 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a 20 20 20  ->nExpr + 8;.   
9ad0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9ae0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20  _item *a;.    a 
9af0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
9b00: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
9b10: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
9b20: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
9b30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
9b40: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
9b50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c  .      return pL
9b60: 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ist;.    }.    p
9b70: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
9b80: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
9b90: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 20 3d  pName ){.    i =
9ba0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 3b   pList->nExpr++;
9bb0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
9bc0: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
9bd0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
9be0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69  zName = 0;.    i
9bf0: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
9c00: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
9c10: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
9c20: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  zName, pName->z,
9c30: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
9c40: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
9c50: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  te(pList->a[i].z
9c60: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
9c70: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
9c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
9c90: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
9ca0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
9cb0: 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 4c 69  oid sqliteExprLi
9cc0: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
9cd0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
9ce0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
9cf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
9d00: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9d10: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9d20: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
9d30: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
9d40: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
9d50: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
9d60: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
9d70: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
9d80: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
9d90: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
9da0: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
9db0: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
9dc0: 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
9dd0: 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
9de0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
9df0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
9e00: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
9e10: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
9e20: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
9e30: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64  IdList *sqliteId
9e40: 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73  ListAppend(IdLis
9e50: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
9e60: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
9e70: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9e80: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
9e90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
9ea0: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
9eb0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
9ec0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
9ed0: 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d  pList->nId & 7)=
9ee0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
9ef0: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b   IdList_item *a;
9f00: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
9f10: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
9f20: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a   (pList->nId+8)*
9f30: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
9f40: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  0]) );.    if( a
9f50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
9f60: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
9f70: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
9f80: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9f90: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
9fa0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
9fb0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
9fc0: 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
9fd0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
9fe0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
9ff0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
a000: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
a010: 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  d].zName;.    sq
a020: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
a030: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  z, pToken->z, pT
a040: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
a050: 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20   if( *pz==0 ){. 
a060: 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73       sqliteIdLis
a070: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
a080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
a090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a0a0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
a0b0: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
a0c0: 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20   pList->nId++;. 
a0d0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
a0e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
a0f0: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
a100: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
a110: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
a120: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
a130: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 64  d sqliteIdListAd
a140: 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20 2a 70  dAlias(IdList *p
a150: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
a160: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
a170: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49 64 3e  t && pList->nId>
a180: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  0 ){.    int i =
a190: 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20 31 3b   pList->nId - 1;
a1a0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
a1b0: 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b  tring(&pList->a[
a1c0: 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65  i].zAlias, pToke
a1d0: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c  n->z, pToken->n,
a1e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44   0);.    sqliteD
a1f0: 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b  equote(pList->a[
a200: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  i].zAlias);.  }.
a210: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
a220: 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69 73 74  an entire IdList
a230: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49  .*/.void sqliteI
a240: 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69  dListDelete(IdLi
a250: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
a260: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
a270: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a280: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
a290: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
a2a0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
a2b0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
a2c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
a2d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
a2e0: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  s);.    if( pLis
a2f0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  t->a[i].pSelect 
a300: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
a310: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
a320: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
a330: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
a340: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
a350: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
a360: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
a370: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  , pList->a[i].pT
a380: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
a390: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
a3a0: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
a3b0: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 0a  ree(pList);.}...
a3c0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20 63  /*.** The COPY c
a3d0: 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63 6f  ommand is for co
a3e0: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
a3f0: 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64 20   PostgreSQL and 
a400: 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a  specificially.**
a410: 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74 79   for the ability
a420: 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74   to read the out
a430: 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20  put of pg_dump. 
a440: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20 61   The format is a
a450: 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s.** follows:.**
a460: 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62 6c  .**    COPY tabl
a470: 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49  e FROM file [USI
a480: 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73 74  NG DELIMITERS st
a490: 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62  ring].**.** "tab
a4a0: 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74 69  le" is an existi
a4b0: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ng table name.  
a4c0: 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e  We will read lin
a4d0: 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a  es of code from.
a4e0: 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20  ** file to fill 
a4f0: 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68 20  this table with 
a500: 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67 68  data.  File migh
a510: 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20 54  t be "stdin".  T
a520: 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  he optional.** d
a530: 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67 20  elimiter string 
a540: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 66  identifies the f
a550: 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73 2e  ield separators.
a560: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
a570: 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20   a tab..*/.void 
a580: 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50 61  sqliteCopy(.  Pa
a590: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a5a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
a5b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
a5c0: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ken *pTableName,
a5d0: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f     /* The name o
a5e0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  f the table into
a5f0: 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 69   which we will i
a600: 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  nsert */.  Token
a610: 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *pFilename,    
a620: 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d  /* The file from
a630: 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69 6e   which to obtain
a640: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
a650: 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69    Token *pDelimi
a660: 74 65 72 20 20 20 20 2f 2a 20 55 73 65 20 74 68  ter    /* Use th
a670: 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64 20  is as the field 
a680: 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29 7b 0a  delimiter */.){.
a690: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a6a0: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69   char *zTab;.  i
a6b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62 65 20  nt i, j;.  Vdbe 
a6c0: 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  *v;.  int addr, 
a6d0: 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  end;.  Index *pI
a6e0: 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  dx;.  sqlite *db
a6f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
a700: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 54    zTab = sqliteT
a710: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
a720: 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  n(pTableName);. 
a730: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
a740: 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61  oc_failed || zTa
a750: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79  b==0 ) goto copy
a760: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62  _cleanup;.  pTab
a770: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
a780: 6c 65 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20  le(db, zTab);.  
a790: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29  sqliteFree(zTab)
a7a0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a7b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
a7c0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
a7d0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
a7e0: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20  ch table: ", 0, 
a7f0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 4e  .        pTableN
a800: 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61  ame->z, pTableNa
a810: 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70  me->n, 0);.    p
a820: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
a830: 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65     goto copy_cle
a840: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  anup;.  }.  if( 
a850: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
a860: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
a870: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
a880: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
a890: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
a8a0: 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74         " may not
a8b0: 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20 30   be modified", 0
a8c0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
a8d0: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
a8e0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
a8f0: 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  }.  v = sqliteGe
a900: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a910: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e   if( v ){.    in
a920: 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 69 66  t openOp;.    if
a930: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
a940: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
a950: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
a960: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a970: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
a980: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a990: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a9a0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64  _VerifyCookie, d
a9b0: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
a9c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
a9d0: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
a9e0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
a9f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
aa00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
aa10: 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a  ileOpen, 0, 0);.
aa20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
aa30: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
aa40: 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46  pFilename->z, pF
aa50: 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  ilename->n);.   
aa60: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
aa70: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
aa80: 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62     openOp = pTab
aa90: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
aaa0: 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65  enWrAux : OP_Ope
aab0: 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69  nWrite;.    sqli
aac0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
aad0: 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e  penOp, 0, pTab->
aae0: 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
aaf0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
ab00: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
ab10: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
ab20: 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d    for(i=1, pIdx=
ab30: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ab40: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ab50: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
ab60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ab70: 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20  p(v, openOp, i, 
ab80: 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pIdx->tnum);.   
ab90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
aba0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
abb0: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
abc0: 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
abd0: 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65  end = sqliteVdbe
abe0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
abf0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
ac00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
ac10: 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e  ileRead, pTab->n
ac20: 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69  Col, end);.    i
ac30: 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b  f( pDelimiter ){
ac40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ac50: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
ac60: 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a  r, pDelimiter->z
ac70: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29  , pDelimiter->n)
ac80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ac90: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
aca0: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
acb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
acc0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
acd0: 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20  r, "\t", 1);.   
ace0: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d   }.    if( pTab-
acf0: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
ad00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ad10: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c  Op(v, OP_FileCol
ad20: 75 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79  umn, pTab->iPKey
ad30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
ad40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ad50: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
ad60: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
ad70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ad80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
ad90: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
ada0: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
adb0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
adc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
add0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
ade0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
adf0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
ae00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ae10: 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( i==pTab->iPKe
ae20: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
ae30: 54 68 65 20 69 6e 74 65 67 65 72 20 70 72 69 6d  The integer prim
ae40: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69  ary key column i
ae50: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 4e 55  s filled with NU
ae60: 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a 20 20 20  LL since its.   
ae70: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73       ** value is
ae80: 20 61 6c 77 61 79 73 20 70 75 6c 6c 65 64 20 66   always pulled f
ae90: 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 6e  rom the record n
aea0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  umber */.       
aeb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
aec0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
aed0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
aee0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
aef0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
af00: 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20  _FileColumn, i, 
af10: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
af20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
af30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
af40: 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43  Record, pTab->nC
af50: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ol, 0);.    sqli
af60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
af70: 50 5f 50 75 74 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Put, 0, 0);.  
af80: 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d    for(i=1, pIdx=
af90: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
afa0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
afb0: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
afc0: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4e 65 78    if( pIdx->pNex
afd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
afe0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
aff0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
b000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
b010: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
b020: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
b030: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b040: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43  ddOp(v, OP_FileC
b050: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 61 69 43  olumn, pIdx->aiC
b060: 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 29 3b 0a 20 20  olumn[j], 0);.  
b070: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b080: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b090: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49  P_MakeIdxKey, pI
b0a0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  dx->nColumn, 0);
b0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b0c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
b0d0: 50 75 74 2c 20 69 2c 20 70 49 64 78 2d 3e 69 73  Put, i, pIdx->is
b0e0: 55 6e 69 71 75 65 29 3b 0a 20 20 20 20 7d 0a 20  Unique);.    }. 
b0f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b100: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
b110: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
b120: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b130: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20  bel(v, end);.   
b140: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b150: 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
b160: 30 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d  0);.    if( (db-
b170: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
b180: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
b190: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b1a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
b1b0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
b1c0: 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61    }.  .copy_clea
b1d0: 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  nup:.  return;.}
b1e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d  ../*.** The non-
b1f0: 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20  standard VACUUM 
b200: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
b210: 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
b220: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c  database,.** col
b230: 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63 65  lapse free space
b240: 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f  , etc.  It is mo
b250: 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  delled after the
b260: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a   VACUUM command.
b270: 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c  ** in PostgreSQL
b280: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b290: 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50  Vacuum(Parse *pP
b2a0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61  arse, Token *pTa
b2b0: 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72  bleName){.  char
b2c0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20   *zName;.  Vdbe 
b2d0: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *v;.  sqlite *db
b2e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
b2f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
b300: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
b310: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
b320: 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  urn;.  if( pTabl
b330: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  eName ){.    zNa
b340: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
b350: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
b360: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  ableName);.  }el
b370: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
b380: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61  0;.  }.  if( zNa
b390: 6d 65 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64  me && sqliteFind
b3a0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
b3b0: 3d 3d 30 0a 20 20 20 20 26 26 20 73 71 6c 69 74  ==0.    && sqlit
b3c0: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
b3d0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
b3e0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
b3f0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
b400: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
b410: 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c 20 7a 4e   or index: ", zN
b420: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
b430: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
b440: 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c 65   goto vacuum_cle
b450: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  anup;.  }.  v = 
b460: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
b470: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
b480: 30 20 29 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f  0 ) goto vacuum_
b490: 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 28  cleanup;.  if( (
b4a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
b4b0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
b4c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
b4d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
b4e0: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  saction, 0, 0);.
b4f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b500: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
b510: 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e 73 63 68 65  Cookie, db->sche
b520: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  ma_cookie, 0);. 
b530: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
b540: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
b550: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29   }.  if( zName )
b560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
b570: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72  AddOp(v, OP_Reor
b580: 67 61 6e 69 7a 65 2c 20 30 2c 20 30 29 3b 0a 20  ganize, 0, 0);. 
b590: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
b5a0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61  ngeP3(v, -1, zNa
b5b0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
b5c0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
b5d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b5e0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
b5f0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b     HashElem *pE;
b600: 0a 20 20 20 20 66 6f 72 28 70 45 3d 73 71 6c 69  .    for(pE=sqli
b610: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
b620: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 3b 20 70  >tblHash); pE; p
b630: 45 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  E=sqliteHashNext
b640: 28 70 45 29 29 7b 0a 20 20 20 20 20 20 70 54 61  (pE)){.      pTa
b650: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
b660: 74 61 28 70 45 29 3b 0a 20 20 20 20 20 20 73 71  ta(pE);.      sq
b670: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b680: 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20   OP_Reorganize, 
b690: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b6a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b6b0: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
b6c0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
b6d0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
b6e0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
b6f0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
b700: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
b710: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b720: 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20   OP_Reorganize, 
b730: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
b740: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b750: 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a  3(v, -1, pIdx->z
b760: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
b770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b780: 20 20 7d 0a 20 20 69 66 28 20 28 64 62 2d 3e 66    }.  if( (db->f
b790: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
b7a0: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
b7b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b7c0: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
b7d0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 76 61 63 75 75  , 0);.  }..vacuu
b7e0: 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  m_cleanup:.  sql
b7f0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
b800: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
b810: 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
b820: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
b830: 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61  qliteBeginTransa
b840: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
b850: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
b860: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
b870: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
b880: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
b890: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
b8a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b8b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
b8c0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
b8d0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
b8e0: 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  n;.  if( db->fla
b8f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
b900: 61 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ans ) return;.  
b910: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
b920: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
b930: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
b940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b950: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31 2c 20  Transaction, 1, 
b960: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
b970: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
b980: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 64 62 2d 3e  rifyCookie, db->
b990: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
b9a0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73  );.    pParse->s
b9b0: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20  chemaVerified = 
b9c0: 31 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  1;.  }.  db->fla
b9d0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54  gs |= SQLITE_InT
b9e0: 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rans;.}../*.** C
b9f0: 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
ba00: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
ba10: 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  teCommitTransact
ba20: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
ba30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
ba40: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
ba50: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
ba60: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
ba70: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
ba80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
ba90: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
baa0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
bab0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
bac0: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
bad0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
bae0: 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ns)==0 ) return;
baf0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
bb00: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bb10: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
bb20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bb30: 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  OP_Commit, 0, 0)
bb40: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
bb50: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
bb60: 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rans;.}../*.** R
bb70: 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
bb80: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
bb90: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  liteRollbackTran
bba0: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
bbb0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
bbc0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
bbd0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
bbe0: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
bbf0: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  >db)==0 || db->p
bc00: 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Be==0 ) return;.
bc10: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
bc20: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
bc30: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
bc40: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
bc50: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
bc60: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74  nTrans)==0 ) ret
bc70: 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  urn;.  v = sqlit
bc80: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
bc90: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
bca0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
bcb0: 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c  (v, OP_Rollback,
bcc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62   0, 0);.  }.  db
bcd0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
bce0: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f  TE_InTrans;.}../
bcf0: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
bd00: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
bd10: 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  as a boolean val
bd20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
bd30: 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61  t getBoolean(cha
bd40: 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20  r *z){.  static 
bd50: 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d  char *azTrue[] =
bd60: 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20   { "yes", "on", 
bd70: 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20  "true" };.  int 
bd80: 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30  i;.  if( z[0]==0
bd90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
bda0: 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29  f( isdigit(z[0])
bdb0: 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26   || (z[0]=='-' &
bdc0: 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29  & isdigit(z[1]))
bdd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
bde0: 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f  toi(z);.  }.  fo
bdf0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
be00: 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61  azTrue)/sizeof(a
be10: 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zTrue[0]); i++){
be20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
be30: 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b  trICmp(z,azTrue[
be40: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
be50: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
be60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  0;.}../*.** Proc
be70: 65 73 73 20 61 20 70 72 61 67 6d 61 20 73 74 61  ess a pragma sta
be80: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
be90: 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74  Pragmas are of t
bea0: 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  his form:.**.** 
beb0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d       PRAGMA id =
bec0: 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65   value.**.** The
bed0: 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68   identifier migh
bee0: 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69  t also be a stri
bef0: 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ng.  The value i
bf00: 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a  s a string, and.
bf10: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  ** identifier, o
bf20: 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20  r a number.  If 
bf30: 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75  minusFlag is tru
bf40: 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  e, then the valu
bf50: 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72  e is.** a number
bf60: 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64   that was preced
bf70: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
bf80: 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gn..*/.void sqli
bf90: 74 65 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a  tePragma(Parse *
bfa0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
bfb0: 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69  Left, Token *pRi
bfc0: 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  ght, int minusFl
bfd0: 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65  ag){.  char *zLe
bfe0: 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ft = 0;.  char *
bff0: 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71  zRight = 0;.  sq
c000: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
c010: 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20  e->db;..  zLeft 
c020: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
c030: 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d  pLeft->z, pLeft-
c040: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71  >n);.  sqliteDeq
c050: 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69  uote(zLeft);.  i
c060: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
c070: 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a      zRight = 0;.
c080: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
c090: 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d  ring(&zRight, "-
c0a0: 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c  ", 1, pRight->z,
c0b0: 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a   pRight->n, 0);.
c0c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69    }else{.    zRi
c0d0: 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ght = sqliteStrN
c0e0: 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70  Dup(pRight->z, p
c0f0: 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73  Right->n);.    s
c100: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69  qliteDequote(zRi
c110: 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 69 66  ght);.  }. .  if
c120: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
c130: 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69 7a  zLeft,"cache_siz
c140: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e")==0 ){.    in
c150: 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52  t size = atoi(zR
c160: 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  ight);.    sqlit
c170: 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  eBtreeSetCacheSi
c180: 7a 65 28 64 62 2d 3e 70 42 65 2c 20 73 69 7a 65  ze(db->pBe, size
c190: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
c1a0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
c1b0: 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74 72 61  zLeft, "vdbe_tra
c1c0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ce")==0 ){.    i
c1d0: 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
c1e0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
c1f0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c200: 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20 20  TE_VdbeTrace;.  
c210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
c220: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
c230: 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a 20  ITE_VdbeTrace;. 
c240: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
c250: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
c260: 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c 5f 63  p(zLeft, "full_c
c270: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30  olumn_names")==0
c280: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
c290: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
c2a0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
c2b0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75 6c 6c  s |= SQLITE_Full
c2c0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 65  ColNames;.    }e
c2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
c2e0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
c2f0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
c300: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
c310: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
c320: 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74 5f  (zLeft, "result_
c330: 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30  set_details")==0
c340: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
c350: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
c360: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
c370: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73 75  s |= SQLITE_Resu
c380: 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d  ltDetails;.    }
c390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
c3a0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
c3b0: 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a  _ResultDetails;.
c3c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
c3d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
c3e0: 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74  mp(zLeft, "count
c3f0: 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b  _changes")==0 ){
c400: 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
c410: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
c420: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
c430: 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  = SQLITE_CountRo
c440: 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
c450: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
c460: 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  = ~SQLITE_CountR
c470: 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ows;.    }.  }el
c480: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
c490: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
c4a0: 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c  empty_result_cal
c4b0: 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20  lbacks")==0 ){. 
c4c0: 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
c4d0: 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
c4e0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
c4f0: 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
c500: 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ack;.    }else{.
c510: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
c520: 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43  &= ~SQLITE_NullC
c530: 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  allback;.    }. 
c540: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
c550: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
c560: 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29  t, "table_info")
c570: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
c580: 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65   *pTab;.    Vdbe
c590: 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20   *v;.    pTab = 
c5a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
c5b0: 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  db, zRight);.   
c5c0: 20 69 66 28 20 70 54 61 62 20 29 20 76 20 3d 20   if( pTab ) v = 
c5d0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
c5e0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  arse);.    if( p
c5f0: 54 61 62 20 26 26 20 76 20 29 7b 0a 20 20 20 20  Tab && v ){.    
c600: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
c610: 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
c620: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
c630: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
c640: 20 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   5, 0,       0},
c650: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
c660: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
c670: 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20         "cid"},. 
c680: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
c690: 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20  mnName,  1, 0,  
c6a0: 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20       "name"},.  
c6b0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
c6c0: 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20  nName,  2, 0,   
c6d0: 20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20      "type"},.   
c6e0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
c6f0: 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20  Name,  3, 0,    
c700: 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20     "notnull"},. 
c710: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
c720: 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20  mnName,  4, 0,  
c730: 20 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65       "dflt_value
c740: 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  "},.      };.   
c750: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
c760: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
c770: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
c780: 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63  (tableInfoPrefac
c790: 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  e), tableInfoPre
c7a0: 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  face);.      for
c7b0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
c7c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
c7d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c7e0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
c7f0: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
c800: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c810: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
c820: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
c830: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c840: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f  v, -1, pTab->aCo
c850: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53  l[i].zName, P3_S
c860: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
c870: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c880: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
c890: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
c8a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c8b0: 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  v, -1, .        
c8c0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
c8d0: 2e 7a 54 79 70 65 20 3f 20 70 54 61 62 2d 3e 61  .zType ? pTab->a
c8e0: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22  Col[i].zType : "
c8f0: 74 65 78 74 22 2c 20 50 33 5f 53 54 41 54 49 43  text", P3_STATIC
c900: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c910: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c920: 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
c930: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c  aCol[i].notNull,
c940: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
c950: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c960: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
c970: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c980: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
c990: 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
c9a0: 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54  ].zDflt, P3_STAT
c9b0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
c9c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c9d0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20  OP_Callback, 5, 
c9e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c9f0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
ca00: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
ca10: 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66  Left, "index_inf
ca20: 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  o")==0 ){.    In
ca30: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
ca40: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
ca50: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 49 64  Vdbe *v;.    pId
ca60: 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
ca70: 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 29 3b  dex(db, zRight);
ca80: 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 20  .    if( pIdx ) 
ca90: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
caa0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
cab0: 66 28 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a  f( pIdx && v ){.
cac0: 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62        static Vdb
cad0: 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  eOp tableInfoPre
cae0: 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  face[] = {.     
caf0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
cb00: 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20  unt, 3, 0,      
cb10: 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f   0},.        { O
cb20: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
cb30: 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65 71 6e  , 0,       "seqn
cb40: 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  o"},.        { O
cb50: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31  P_ColumnName,  1
cb60: 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69 64 22  , 0,       "cid"
cb70: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
cb80: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20  ColumnName,  2, 
cb90: 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d  0,       "name"}
cba0: 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
cbb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54   int i;.      pT
cbc0: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
cbd0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
cbe0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
cbf0: 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49  ArraySize(tableI
cc00: 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62  nfoPreface), tab
cc10: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a  leInfoPreface);.
cc20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cc30: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
cc40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
cc50: 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61  t cnum = pIdx->a
cc60: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
cc70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cc80: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
cc90: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
cca0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ccb0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ccc0: 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20   cnum, 0);.     
ccd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cce0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
ccf0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
cd00: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
cd10: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
cd20: 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65  aCol[cnum].zName
cd30: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
cd40: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
cd50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
cd60: 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20  back, 3, 0);.   
cd70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
cd80: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
cd90: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
cda0: 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20  index_list")==0 
cdb0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
cdc0: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
cdd0: 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
cde0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
cdf0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
ce00: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
ce10: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
ce20: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
ce30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
ce40: 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49   pIdx = pTab->pI
ce50: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
ce60: 69 66 28 20 70 54 61 62 20 26 26 20 70 49 64 78  if( pTab && pIdx
ce70: 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 69   && v ){.      i
ce80: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
ce90: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69   static VdbeOp i
cea0: 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b  ndexListPreface[
ceb0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
cec0: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
ced0: 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
cee0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
cef0: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
cf00: 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20        "seq"},.  
cf10: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
cf20: 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
cf30: 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
cf40: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
cf50: 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
cf60: 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20     "unique"},.  
cf70: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71      };..      sq
cf80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
cf90: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69  t(v, ArraySize(i
cfa0: 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
cfb0: 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  , indexListPrefa
cfc0: 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ce);.      while
cfd0: 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20  (pIdx){.        
cfe0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cff0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
d000: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
d010: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d020: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d030: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d040: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d050: 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
d060: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d070: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d080: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
d090: 67 65 72 2c 20 70 49 64 78 2d 3e 69 73 55 6e 69  ger, pIdx->isUni
d0a0: 71 75 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  que, 0);.       
d0b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d0c0: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
d0d0: 20 33 2c 20 30 29 3b 0a 09 2b 2b 69 3b 0a 09 70   3, 0);..++i;..p
d0e0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65 78  Idx = pIdx->pNex
d0f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
d100: 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
d110: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73  f NDEBUG.  if( s
d120: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
d130: 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72 61 63  ft, "parser_trac
d140: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  e")==0 ){.    ex
d150: 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65  tern void sqlite
d160: 50 61 72 73 65 72 54 72 61 63 65 28 46 49 4c 45  ParserTrace(FILE
d170: 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20 20 20  *, char *);.    
d180: 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
d190: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
d1a0: 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
d1b0: 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65  e(stdout, "parse
d1c0: 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r: ");.    }else
d1d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 61  {.      sqlitePa
d1e0: 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b  rserTrace(0, 0);
d1f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
d200: 65 6e 64 69 66 0a 0a 20 20 7b 7d 0a 20 20 73 71  endif..  {}.  sq
d210: 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b  liteFree(zLeft);
d220: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52  .  sqliteFree(zR
d230: 69 67 68 74 29 3b 0a 7d 0a                       ight);.}.