/ Hex Artifact Content
Login

Artifact 5ea24a62f447f3beabe6fb6218ec24f4dd6aff95:


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 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 31 33 38 20 32 30  ild.c,v 1.138 20
0310: 30 33 2f 30 33 2f 33 31 20 30 32 3a 31 32 3a 34  03/03/31 02:12:4
0320: 37 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  7 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 66 61 6b  ** This is a fak
0590: 65 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e callback proce
05a0: 64 75 72 65 20 75 73 65 64 20 77 68 65 6e 20 73  dure used when s
05b0: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 69 73 0a  qlite_exec() is.
05c0: 2a 2a 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  ** invoked with 
05d0: 61 20 4e 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 20  a NULL callback 
05e0: 70 6f 69 6e 74 65 72 2e 20 20 49 66 20 77 65 20  pointer.  If we 
05f0: 70 61 73 73 20 61 20 4e 55 4c 4c 20 63 61 6c 6c  pass a NULL call
0600: 62 61 63 6b 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  back.** pointer 
0610: 69 6e 74 6f 20 73 71 6c 69 74 65 56 64 62 65 45  into sqliteVdbeE
0620: 78 65 63 28 29 20 69 74 20 77 69 6c 6c 20 72 65  xec() it will re
0630: 74 75 72 6e 20 61 74 20 65 76 65 72 79 20 4f 50  turn at every OP
0640: 5f 43 61 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 77 68  _Callback,.** wh
0650: 69 63 68 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  ich we do not wa
0660: 6e 74 20 69 74 20 74 6f 20 64 6f 2e 20 20 53 6f  nt it to do.  So
0670: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61   we substitute a
0680: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
0690: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 69 6e  .** procedure in
06a0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 4e 55   place of the NU
06b0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
06c0: 74 20 66 61 6b 65 43 61 6c 6c 62 61 63 6b 28 76  t fakeCallback(v
06d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  oid *NotUsed, in
06e0: 74 20 6e 2c 20 63 68 61 72 20 2a 2a 61 7a 31 2c  t n, char **az1,
06f0: 20 63 68 61 72 20 2a 2a 61 7a 32 29 7b 0a 20 20   char **az2){.  
0700: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0720: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0730: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0740: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0750: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
0760: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
0770: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
0780: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0790: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
07a0: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
07b0: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
07c0: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
07d0: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
07e0: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
07f0: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0800: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0810: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0820: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
0830: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
0840: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0860: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0870: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0880: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0890: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
08a0: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
08b0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
08c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
08d0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
08e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
08f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
0900: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
0910: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
0920: 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68  d*,int,char**,ch
0930: 61 72 2a 2a 29 3b 0a 0a 20 20 69 66 28 20 73 71  ar**);..  if( sq
0940: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
0950: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  ed ) return;.  x
0960: 43 61 6c 6c 62 61 63 6b 20 3d 20 70 50 61 72 73  Callback = pPars
0970: 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  e->xCallback;.  
0980: 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 3d 3d 30  if( xCallback==0
0990: 20 26 26 20 70 50 61 72 73 65 2d 3e 75 73 65 43   && pParse->useC
09a0: 61 6c 6c 62 61 63 6b 20 29 20 78 43 61 6c 6c 62  allback ) xCallb
09b0: 61 63 6b 20 3d 20 66 61 6b 65 43 61 6c 6c 62 61  ack = fakeCallba
09c0: 63 6b 3b 0a 20 20 69 66 28 20 76 20 26 26 20 70  ck;.  if( v && p
09d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
09e0: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
09f0: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0a00: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0a10: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0a20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   0;.    sqliteVd
0a30: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
0a40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0a50: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 78 43  eMakeReady(v, xC
0a60: 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73 65 2d  allback, pParse-
0a70: 3e 70 41 72 67 2c 20 70 50 61 72 73 65 2d 3e 65  >pArg, pParse->e
0a80: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28  xplain);.    if(
0a90: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0aa0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66  back ){.      if
0ab0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
0ac0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
0ad0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74  = sqliteVdbeList
0ae0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  (v);.        db-
0af0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
0b00: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
0b10: 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 7d  _cookie;.      }
0b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
0b30: 6c 69 74 65 56 64 62 65 45 78 65 63 28 76 29 3b  liteVdbeExec(v);
0b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
0b50: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69  c = sqliteVdbeFi
0b60: 6e 61 6c 69 7a 65 28 76 2c 20 26 70 50 61 72 73  nalize(v, &pPars
0b70: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0b80: 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72     if( rc ) pPar
0b90: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0ba0: 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20    pParse->pVdbe 
0bb0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 72 73  = 0;.      pPars
0bc0: 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
0bd0: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0be0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0bf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
0c00: 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d  se->rc = pParse-
0c10: 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45  >nErr ? SQLITE_E
0c20: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
0c30: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  NE;.    }.    pP
0c40: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
0c50: 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  t = 0;.    pPars
0c60: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
0c70: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 0;.  }else i
0c80: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61  f( pParse->useCa
0c90: 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
0ca0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
0cb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
0cc0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
0cd0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
0ce0: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
0cf0: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
0d00: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
0d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
0d20: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
0d30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
0d40: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
0d50: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
0d60: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
0d70: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74   name.** of that
0d80: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
0d90: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
0da0: 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  d..*/.Table *sql
0db0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  iteFindTable(sql
0dc0: 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  ite *db, const c
0dd0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
0de0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
0df0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
0e00: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
0e10: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0e20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
0e30: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
0e40: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
0e50: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
0e60: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
0e70: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
0e80: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 44 61 74  liteStrICmp(zDat
0e90: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
0ea0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
0eb0: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
0ec0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
0ed0: 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c  >aDb[j].tblHash,
0ee0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
0ef0: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
0f00: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
0f10: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0f20: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
0f30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
0f40: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
0f50: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
0f60: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
0f70: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
0f80: 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  t index..** Retu
0f90: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0fa0: 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  ound..*/.Index *
0fb0: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
0fc0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
0fd0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
0fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
0ff0: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
1000: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1010: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1020: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
1030: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
1040: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
1050: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
1060: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
1070: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
1080: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Db, db->aDb[j].z
1090: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
10a0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
10b0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
10c0: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
10d0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
10e0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
10f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1100: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1110: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1120: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1130: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1140: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1150: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1160: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1170: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1180: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1190: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
11a0: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
11b0: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
11c0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
11d0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
11e0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
11f0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
1200: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
1210: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1220: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1230: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
1240: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
1250: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
1260: 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  ld;..  assert( d
1270: 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65  b!=0 && p->zName
1280: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
1290: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
12a0: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
12b0: 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].idxHash, p->zN
12c0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12e0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
12f0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
1300: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
1310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
1320: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
1330: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
1340: 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pOld->zName,. 
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d      strlen(pOld-
1370: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29  >zName)+1, pOld)
1380: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1390: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
13a0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
13b0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
13c0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
13d0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
13e0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
13f0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1400: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1410: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1420: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1430: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
1440: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1450: 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66  x *pIndex){.  if
1460: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
1470: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
1480: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
1490: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
14a0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
14b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
14c0: 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  ex *p;.    for(p
14d0: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
14e0: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
14f0: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
1500: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
1510: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e    if( p && p->pN
1520: 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ext==pIndex ){. 
1530: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
1540: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1550: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1560: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
1570: 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a   pIndex);.}../*.
1580: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
1590: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
15a0: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
15b0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
15c0: 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  f.** database co
15d0: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
15e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15f0: 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d  d to reclaim mem
1600: 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68  ory.** before th
1610: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f  e connection clo
1620: 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f  ses.  It is also
1630: 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61   called during a
1640: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20   rollback.** if 
1650: 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d  there were schem
1660: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
1670: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1680: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
1690: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
16a0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
16b0: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
16c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
16d0: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
16e0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
16f0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
1700: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
1710: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
1720: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1730: 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  teResetInternalS
1740: 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a 64 62  chema(sqlite *db
1750: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61  , int iDb){.  Ha
1760: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
1770: 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48   Hash temp1;.  H
1780: 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74  ash temp2;.  int
1790: 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74   i, j;..  assert
17a0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
17b0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d  db->nDb );.  db-
17c0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
17d0: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20  E_Initialized;. 
17e0: 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62   for(i=iDb; i<db
17f0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1800: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
1810: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70  aDb[i];.    temp
1820: 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68  1 = pDb->tblHash
1830: 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44  ;.    temp2 = pD
1840: 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  b->trigHash;.   
1850: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28   sqliteHashInit(
1860: 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20  &pDb->trigHash, 
1870: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
1880: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  NG, 0);.    sqli
1890: 74 65 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  teHashClear(&pDb
18a0: 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71  ->aFKey);.    sq
18b0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
18c0: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20  Db->idxHash);.  
18d0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
18e0: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
18f0: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
1900: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1910: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
1920: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
1930: 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  r = sqliteHashDa
1940: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20  ta(pElem);.     
1950: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69   sqliteDeleteTri
1960: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
1970: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1980: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32  HashClear(&temp2
1990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  );.    sqliteHas
19a0: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
19b0: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
19c0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
19d0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
19e0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
19f0: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
1a00: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1a10: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
1a20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
1a30: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1a40: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1a50: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1a60: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
1a70: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
1a80: 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 64 62  (&temp1);.    db
1a90: 2d 3e 61 44 62 5b 69 5d 2e 66 6c 61 67 73 20 26  ->aDb[i].flags &
1aa0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61  = ~SQLITE_Initia
1ab0: 6c 69 7a 65 64 3b 0a 20 20 20 20 69 66 28 20 69  lized;.    if( i
1ac0: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
1ad0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
1ae0: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
1af0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1b00: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
1b10: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
1b20: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
1b30: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
1b40: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
1b50: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
1b60: 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68  ove then from th
1b70: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
1b80: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
1b90: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
1ba0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
1bb0: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
1bc0: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
1bd0: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
1be0: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
1bf0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
1c00: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
1c10: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
1c20: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
1c30: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
1c40: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a  ..  */.  for(i=j
1c50: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
1c60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1c70: 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
1c80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
1c90: 65 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  ee(db->aDb[i].zN
1ca0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  ame);.      db->
1cb0: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  aDb[i].zName = 0
1cc0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ce0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
1cf0: 3e 61 44 62 5b 6a 2b 2b 5d 20 3d 20 64 62 2d 3e  >aDb[j++] = db->
1d00: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
1d10: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
1d20: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
1d30: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
1d40: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
1d50: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
1d60: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
1d70: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
1d80: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
1d90: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
1da0: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
1db0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
1dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1dd0: 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  e(db->aDb);.    
1de0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
1df0: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
1e00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
1e20: 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
1e30: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65   occurs.  If the
1e40: 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d  re were.** schem
1e50: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
1e60: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e70: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
1e80: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69  o reset the.** i
1e90: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
1ea0: 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  les and reload t
1eb0: 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  hem from disk..*
1ec0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c  /.void sqliteRol
1ed0: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
1ee0: 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29  nges(sqlite *db)
1ef0: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  {.  if( db->flag
1f00: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
1f10: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
1f20: 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72  sqliteResetInter
1f30: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
1f40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1f60: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
1f70: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
1f80: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1f90: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1fa0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64  sqlite *db){.  d
1fb0: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
1fc0: 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 6e 65  _cookie = db->ne
1fd0: 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d  xt_cookie;.  db-
1fe0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
1ff0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2010: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
2020: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2030: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2040: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
2050: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
2060: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
2070: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2080: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2090: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
20a0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
20b0: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
20c0: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
20d0: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
20e0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
20f0: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
2100: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
2110: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
2120: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
2130: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
2140: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
2150: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
2160: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
2170: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
2180: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
2190: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
21a0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  able..**.** Indi
21b0: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
21c0: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72  ith the table ar
21d0: 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  e unlinked from 
21e0: 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61  the "db".** data
21f0: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62   structure if db
2200: 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d  !=NULL.  If db==
2210: 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74  NULL, indices at
2220: 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65  tached to.** the
2230: 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74   table are delet
2240: 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73  ed, but it is as
2250: 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20  sumed they have 
2260: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20  already been.** 
2270: 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69  unlinked..*/.voi
2280: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61  d sqliteDeleteTa
2290: 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ble(sqlite *db, 
22a0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
22b0: 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78    int i;.  Index
22c0: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
22d0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
22e0: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
22f0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
2300: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65  return;..  /* De
2310: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
2320: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2330: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
2340: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
2350: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
2360: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
2370: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
2380: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2390: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
23a0: 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  ndex->iDb==pTabl
23b0: 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c  e->iDb || (pTabl
23c0: 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e  e->iDb==0 && pIn
23d0: 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a  dex->iDb==1) );.
23e0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
23f0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
2400: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
2410: 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20  ete all foreign 
2420: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
2430: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
2440: 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20    The keys.  ** 
2450: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
2460: 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  ady been unlinke
2470: 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61  d from the db->a
2480: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20  FKey hash table 
2490: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65  .  */.  for(pFKe
24a0: 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b  y=pTable->pFKey;
24b0: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e   pFKey; pFKey=pN
24c0: 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e  extFKey){.    pN
24d0: 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d  extFKey = pFKey-
24e0: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
24f0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
2500: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  eHashFind(&db->a
2530: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
2540: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
2570: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
2580: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
2590: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
25a0: 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ey);.  }..  /* D
25b0: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
25c0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
25d0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
25e0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
25f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
2600: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2610: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
2620: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2630: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  able->aCol[i].zD
2640: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
2650: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
2660: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d  l[i].zType);.  }
2670: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
2680: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
2690: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
26a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  e->aCol);.  sqli
26b0: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
26c0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
26d0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
26e0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
26f0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
2700: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
2710: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2720: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
2730: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
2740: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
2750: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
2760: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74  gn keys..*/.stat
2770: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e  ic void sqliteUn
2780: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
2790: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
27a0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c  able *p){.  Tabl
27b0: 65 20 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20  e *pOld;.  FKey 
27c0: 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 69 6e  *pF1, *pF2;.  in
27d0: 74 20 69 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20  t i = p->iDb;.  
27e0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
27f0: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
2800: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2810: 61 44 62 5b 69 5d 2e 74 62 6c 48 61 73 68 2c 20  aDb[i].tblHash, 
2820: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
2830: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
2840: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64  ;.  assert( pOld
2850: 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29  ==0 || pOld==p )
2860: 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70  ;.  for(pF1=p->p
2870: 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70  FKey; pF1; pF1=p
2880: 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  F1->pNextFrom){.
2890: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
28a0: 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b  rlen(pF1->zTo) +
28b0: 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20 73 71   1;.    pF2 = sq
28c0: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
28d0: 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20  ->aDb[i].aFKey, 
28e0: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  pF1->zTo, nTo);.
28f0: 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31      if( pF2==pF1
2900: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2910: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2920: 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46  aDb[i].aFKey, pF
2930: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31  1->zTo, nTo, pF1
2940: 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20  ->pNextTo);.    
2950: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
2960: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
2970: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
2980: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
2990: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46  ; }.      if( pF
29a0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32  2 ){.        pF2
29b0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d  ->pNextTo = pF1-
29c0: 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20  >pNextTo;.      
29d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
29e0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
29f0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2a00: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e   Construct the n
2a10: 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61  ame of a user ta
2a20: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f  ble or index fro
2a30: 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  m a token..**.**
2a40: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2a50: 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  he name is obtai
2a60: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
2a70: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
2a80: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
2a90: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2aa0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
2ab0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
2ac0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
2ad0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
2ae0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
2af0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
2b00: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
2b10: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
2b20: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2b40: 61 74 65 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  ate code to open
2b50: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2b60: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
2b70: 54 68 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 70 65  The table.** ope
2b80: 6e 65 64 20 77 69 6c 6c 20 62 65 20 53 51 4c 49  ned will be SQLI
2b90: 54 45 5f 4d 41 53 54 45 52 20 66 6f 72 20 70 65  TE_MASTER for pe
2ba0: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 73 20  rsistent tables 
2bb0: 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  and .** SQLITE_T
2bc0: 45 4d 50 5f 4d 41 53 54 45 52 20 66 6f 72 20 74  EMP_MASTER for t
2bd0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
2be0: 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f    The table is o
2bf0: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 63 75 72 73  pened.** on curs
2c00: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
2c10: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
2c20: 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ble(Vdbe *v, int
2c30: 20 69 73 54 65 6d 70 29 7b 0a 20 20 73 71 6c 69   isTemp){.  sqli
2c40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
2c50: 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d  P_Integer, isTem
2c60: 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  p, 0);.  sqliteV
2c70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
2c80: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32 29 3b  penWrite, 0, 2);
2c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
2ca0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
2cb0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
2cc0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
2cd0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
2ce0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
2cf0: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
2d00: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
2d10: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
2d20: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
2d30: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
2d40: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
2d50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2d60: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
2d70: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
2d80: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
2d90: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
2da0: 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70   name.  The.** p
2db0: 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74  Start token is t
2dc0: 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e  he CREATE and pN
2dd0: 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65  ame is the table
2de0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65   name.  The isTe
2df0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
2e00: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
2e10: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
2e20: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
2e30: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
2e40: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
2e50: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2e60: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
2e70: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
2e80: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
2e90: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
2ea0: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
2eb0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
2ec0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
2ed0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
2ee0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
2ef0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
2f00: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
2f10: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
2f20: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
2f30: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2f40: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2f50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
2f60: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
2f70: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
2f80: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
2f90: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
2fa0: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
2fb0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
2fc0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2fd0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 45 6e 64  t, the sqliteEnd
2fe0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
2ff0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
3000: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
3010: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
3020: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
3030: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3040: 65 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  eStartTable(.  P
3050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3060: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3070: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  t */.  Token *pS
3080: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22  tart,   /* The "
3090: 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f  CREATE" token */
30a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
30b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
30c0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 74 6f 20  able or view to 
30d0: 63 72 65 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  create */.  int 
30e0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
30f0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
3100: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
3110: 20 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20    int isView    
3120: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3130: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
3140: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
3150: 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  le;.  Index *pId
3160: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  x;.  char *zName
3170: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
3180: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
3190: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
31a0: 62 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46  b;..  pParse->sF
31b0: 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74  irstToken = *pSt
31c0: 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  art;.  zName = s
31d0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
31e0: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
31f0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
3200: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3210: 50 61 72 73 65 2d 3e 69 44 62 3d 3d 31 20 29 20  Parse->iDb==1 ) 
3220: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
3230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3240: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
3250: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
3260: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
3270: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
3280: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
3290: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
32a0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
32b0: 29 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c  ), 0) ){.    sql
32c0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
32d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
32e0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
32f0: 3b 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ;.    if( isView
3300: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
3310: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
3320: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
3330: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
3340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3350: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3360: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
3370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3380: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
3390: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
33a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
33b0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
33c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33d0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
33e0: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
33f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3400: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
3410: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
3420: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  ode, zName, 0) )
3430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
3440: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
3450: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3460: 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 0a 20 20 2f   }.#endif. ..  /
3470: 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20  * Before trying 
3480: 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70  to create a temp
3490: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b  orary table, mak
34a0: 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65  e sure the Btree
34b0: 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   for.  ** holdin
34c0: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
34d0: 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f  es is open..  */
34e0: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26  .  if( isTemp &&
34f0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
3500: 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
3510: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
3520: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72  t rc = sqliteBtr
3530: 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 4d 41 58  eeOpen(0, 0, MAX
3540: 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62  _PAGES, &db->aDb
3550: 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [1].pBt);.    if
3560: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
3580: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
3590: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
35a0: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
35b0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
35c0: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
35d0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
35e0: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30  orary tables", 0
35f0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3600: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
3610: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
3620: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
3630: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
3640: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3650: 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72  liteBtreeBeginTr
3660: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
3670: 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
3680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
36a0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
36b0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
36c0: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
36d0: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
36e0: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
36f0: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
3700: 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  le", 0);.       
3710: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3720: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
3730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3740: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
3750: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
3760: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
3770: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
3780: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
3790: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
37a0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
37b0: 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20  r message if it 
37c0: 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  does..  **.  ** 
37d0: 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61  If we are re-rea
37e0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
37f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
3800: 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61  ause of a schema
3810: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64  .  ** change and
3820: 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74   a new permanent
3830: 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20   table is found 
3840: 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69  whose name colli
3850: 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  des with.  ** an
3860: 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72   existing tempor
3870: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61 74 20  ary table, that 
3880: 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e  is not an error.
3890: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d  .  */.  pTable =
38a0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
38b0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  (db, zName, 0);.
38c0: 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f    iDb = isTemp ?
38d0: 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62   1 : pParse->iDb
38e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  ;.  if( pTable!=
38f0: 30 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 69 44  0 && (pTable->iD
3900: 62 3d 3d 69 44 62 20 7c 7c 20 21 70 50 61 72 73  b==iDb || !pPars
3910: 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a  e->initFlag) ){.
3920: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
3930: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3940: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
3950: 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e   0, pName->z, pN
3960: 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20  ame->n,.        
3970: 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
3980: 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  ", 0, 0);.    sq
3990: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
39a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
39b0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
39c0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78  .  }.  if( (pIdx
39d0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
39e0: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
39f0: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
3a00: 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20    (pIdx->iDb==0 
3a10: 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  || !pParse->init
3a20: 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  Flag) ){.    sql
3a30: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
3a40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3a50: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
3a60: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
3a70: 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ", .       zName
3a80: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3a90: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
3aa0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3ab0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3ac0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
3ad0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
3ae0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
3af0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
3b00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3b10: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
3b20: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
3b30: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
3b40: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3b50: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
3b60: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3b70: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
3b80: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
3b90: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20  ;.  pTable->iDb 
3ba0: 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61  = iDb;.  if( pPa
3bb0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
3bc0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
3bd0: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  le(db, pParse->p
3be0: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
3bf0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
3c00: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42   pTable;..  /* B
3c10: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
3c20: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
3c30: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
3c40: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
3c50: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
3c60: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
3c70: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
3c80: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
3c90: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
3ca0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
3cb0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
3cc0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
3cd0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
3ce0: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
3cf0: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
3d00: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
3d10: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
3d20: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
3d30: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
3d40: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
3d50: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
3d60: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
3d70: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
3d80: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
3d90: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
3da0: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
3db0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
3dc0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
3dd0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
3de0: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47   && (v = sqliteG
3df0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
3e00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3e10: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
3e20: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
3e30: 73 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20  sTemp);.    if( 
3e40: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
3e50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3e60: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
3e70: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
3e80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
3e90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3ea0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31  _SetCookie, 0, 1
3eb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
3ec0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
3ed0: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
3ee0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3ef0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
3f00: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
3f10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f20: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
3f30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3f40: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3f50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
3f60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3f70: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
3f80: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
3f90: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
3fa0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
3fb0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3fc0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
3fd0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3fe0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3ff0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
4000: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
4010: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
4020: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4030: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
4040: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
4050: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
4060: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
4070: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
4080: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
4090: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
40a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
40b0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
40c0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
40d0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
40e0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
40f0: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c  ar *z = 0;.  Col
4100: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
4110: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4120: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4130: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65  turn;.  sqliteSe
4140: 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61  tNString(&z, pNa
4150: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
4160: 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   0);.  if( z==0 
4170: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
4180: 74 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  teDequote(z);.  
4190: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
41a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
41b0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
41c0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
41d0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
41e0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
41f0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
4200: 67 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  g, "duplicate co
4210: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c  lumn name: ", z,
4220: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
4230: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
4240: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
4250: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4260: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
4270: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
4280: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
4290: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
42a0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
42b0: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
42c0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
42d0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
42e0: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
42f0: 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  rn;.    p->aCol 
4300: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
4310: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
4320: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
4330: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
4340: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
4350: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
4360: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72  ;.  pCol->sortOr
4370: 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
4380: 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  NUM;.  p->nCol++
4390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
43a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
43b0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
43c0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
43d0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
43e0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
43f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
4400: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
4410: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
4420: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
4430: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
4440: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
4450: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
4460: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
4470: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
4480: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4490: 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  liteAddNotNull(P
44a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
44b0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
44c0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
44d0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
44e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
44f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
4500: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
4510: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
4520: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
4530: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
4540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4550: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
4560: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
4570: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
4580: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
4590: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
45a0: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
45b0: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
45c0: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
45d0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
45e0: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
45f0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
4600: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
4610: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
4620: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
4630: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
4640: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
4650: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
4660: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
4670: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
4680: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
4690: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
46a0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
46b0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
46c0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
46d0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
46e0: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
46f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4700: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
4710: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
4720: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
4730: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
4740: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
4750: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
4760: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
4770: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
4780: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4790: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
47a0: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
47b0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
47c0: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
47d0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
47e0: 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28  pLast->n + Addr(
47f0: 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72  pLast->z) - Addr
4800: 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73  (pFirst->z);.  s
4810: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
4820: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
4830: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
4840: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
4850: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
4860: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
4870: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
4880: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
4890: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
48a0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
48b0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
48c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
48d0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
48e0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f   ){.    pCol->so
48f0: 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65  rtOrder = sqlite
4900: 43 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e  CollateType(z, n
4910: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4920: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
4930: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  = SQLITE_SO_NUM;
4940: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
4950: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
4960: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
4970: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
4980: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
4990: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
49a0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
49b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
49c0: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
49d0: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
49e0: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
49f0: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
4a00: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
4a10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4a20: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
4a30: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
4a40: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
4a50: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
4a60: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4a70: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
4a80: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c  iteAddDefaultVal
4a90: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
4aa0: 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69  , Token *pVal, i
4ab0: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
4ac0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
4ad0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b   i;.  char **pz;
4ae0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
4af0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
4b00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
4b10: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
4b20: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
4b30: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
4b40: 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28  [i].zDflt;.  if(
4b50: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
4b60: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
4b70: 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70  ng(pz, "-", 1, p
4b80: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
4b90: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
4ba0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
4bb0: 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20  ng(pz, pVal->z, 
4bc0: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
4bd0: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
4be0: 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (*pz);.}../*.** 
4bf0: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
4c00: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
4c10: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
4c20: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
4c30: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
4c40: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
4c50: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
4c60: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
4c70: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
4c80: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
4c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
4ca0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
4cb0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
4cc0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
4cd0: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
4ce0: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
4cf0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
4d00: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
4d10: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
4d20: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
4d30: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
4d40: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
4d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
4d60: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
4d70: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
4d80: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
4d90: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
4da0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
4db0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
4dc0: 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e  n as the row id.
4dd0: 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a    (Exception:.**
4de0: 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
4df0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
4e00: 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65  h older database
4e10: 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  s, do not do thi
4e20: 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  s.** if the file
4e30: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
4e40: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
4e50: 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65  han 1.)  Set the
4e60: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
4e70: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
4e80: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
4e90: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
4ea0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4eb0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4ec0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
4ed0: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
4ee0: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
4ef0: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
4f00: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
4f10: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
4f20: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
4f30: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
4f40: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
4f50: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
4f60: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
4f70: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
4f80: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4f90: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
4fa0: 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b  qliteAddPrimaryK
4fb0: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
4fc0: 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
4fd0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
4fe0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
4ff0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5000: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
5010: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
5020: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62  = -1;.  if( pTab
5030: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  ==0 ) goto prima
5040: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
5050: 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  f( pTab->hasPrim
5060: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
5070: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
5080: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
5090: 62 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a  ble \"", pTab->z
50a0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22  Name, .        "
50b0: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
50c0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
50d0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
50e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
50f0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
5100: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
5110: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
5120: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
5130: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
5140: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
5150: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
5160: 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20  ->nId==1 ){.    
5170: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
5180: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
5190: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
51a0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
51b0: 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ist->a[0].zName,
51c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
51d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
51e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
51f0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
5200: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
5210: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
5220: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5230: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
5240: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
5250: 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a  e_format>=1 && .
5260: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
5270: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
5280: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
5290: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
52a0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
52b0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
52c0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
52d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
52e0: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  teCreateIndex(pP
52f0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73  arse, 0, 0, pLis
5300: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
5310: 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , 0);.    pList 
5320: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
5330: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
5340: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
5350: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
5360: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
5370: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
5380: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70  te collating typ
5390: 65 20 67 69 76 65 6e 20 61 20 74 79 70 65 20 6e  e given a type n
53a0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ame..**.** The c
53b0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 69 73  ollation type is
53c0: 20 74 65 78 74 20 28 53 51 4c 49 54 45 5f 53 4f   text (SQLITE_SO
53d0: 5f 54 45 58 54 29 20 69 66 20 74 68 65 20 74 79  _TEXT) if the ty
53e0: 70 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74 61  pe.** name conta
53f0: 69 6e 73 20 74 68 65 20 63 68 61 72 61 63 74 65  ins the characte
5400: 72 20 73 74 72 65 61 6d 20 22 74 65 78 74 22 20  r stream "text" 
5410: 6f 72 20 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20  or "blob" or.** 
5420: 22 63 6c 6f 62 22 2e 20 20 41 6e 79 20 6f 74 68  "clob".  Any oth
5430: 65 72 20 74 79 70 65 20 6e 61 6d 65 20 69 73 20  er type name is 
5440: 63 6f 6c 6c 61 74 65 64 20 61 73 20 6e 75 6d 65  collated as nume
5450: 72 69 63 0a 2a 2a 20 28 53 51 4c 49 54 45 5f 53  ric.** (SQLITE_S
5460: 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73  O_NUM)..*/.int s
5470: 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65  qliteCollateType
5480: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79  (const char *zTy
5490: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
54a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
54b0: 3d 30 3b 20 69 3c 6e 54 79 70 65 2d 31 3b 20 69  =0; i<nType-1; i
54c0: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
54d0: 20 7a 54 79 70 65 5b 69 5d 20 29 7b 0a 20 20 20   zType[i] ){.   
54e0: 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20 20     case 'b':.   
54f0: 20 20 20 63 61 73 65 20 27 42 27 3a 20 7b 0a 20     case 'B': {. 
5500: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 54 79         if( i<nTy
5510: 70 65 2d 33 20 26 26 20 73 71 6c 69 74 65 53 74  pe-3 && sqliteSt
5520: 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d  rNICmp(&zType[i]
5530: 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b  ,"blob",4)==0 ){
5540: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5550: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  n SQLITE_SO_TEXT
5560: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5580: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 63   }.      case 'c
5590: 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 43  ':.      case 'C
55a0: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ': {.        if(
55b0: 20 69 3c 6e 54 79 70 65 2d 33 20 26 26 20 28 73   i<nType-3 && (s
55c0: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a  qliteStrNICmp(&z
55d0: 54 79 70 65 5b 69 5d 2c 22 63 68 61 72 22 2c 34  Type[i],"char",4
55e0: 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  )==0 ||.        
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d     sqliteStrNICm
5610: 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 6c 6f  p(&zType[i],"clo
5620: 62 22 2c 34 29 3d 3d 30 29 0a 20 20 20 20 20 20  b",4)==0).      
5630: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
5640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
5650: 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TEXT;.        }.
5660: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
5680: 65 20 27 78 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'x':.      cas
5690: 65 20 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'X': {.       
56a0: 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c   if( i>=2 && sql
56b0: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79  iteStrNICmp(&zTy
56c0: 70 65 5b 69 2d 32 5d 2c 22 74 65 78 74 22 2c 34  pe[i-2],"text",4
56d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
56e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
56f0: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20  SO_TEXT;.       
5700: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
5710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5720: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5740: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  turn SQLITE_SO_N
5760: 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  UM;.}../*.** Thi
5770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5780: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
5790: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
57a0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
57b0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
57c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
57d0: 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73   "COLLATE" claus
57e0: 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  e has.** been se
57f0: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
5800: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5810: 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f  ts the Column.so
5820: 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68  rtOrder on.** th
5830: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
5840: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
5850: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
5860: 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61 74 65 54  qliteAddCollateT
5870: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
5880: 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29  e, int collType)
5890: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
58a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
58b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
58c0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
58d0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
58e0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
58f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f  p->aCol[i].sortO
5900: 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b  rder = collType;
5910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75  .}../*.** Come u
5920: 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e  p with a new ran
5930: 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  dom value for th
5940: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
5950: 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74    Make sure.** t
5960: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
5970: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
5980: 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  he old..**.** Th
5990: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
59a0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
59b0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
59c0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
59d0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
59e0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
59f0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
5a00: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
5a10: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
5a20: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
5a30: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
5a40: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
5a50: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
5a60: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
5a70: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
5a80: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
5a90: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
5aa0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
5ab0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
5ac0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
5ad0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
5ae0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
5af0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
5b00: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
5b10: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
5b20: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
5b30: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
5b40: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
5b50: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
5b60: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
5b70: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
5b80: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
5b90: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
5ba0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
5bb0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
5bc0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
5bd0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
5be0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
5bf0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
5c00: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
5c10: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
5c20: 69 64 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43  id sqliteChangeC
5c30: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62  ookie(sqlite *db
5c40: 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  , Vdbe *v){.  if
5c50: 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  ( db->next_cooki
5c60: 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63  e==db->aDb[0].sc
5c70: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20  hema_cookie ){. 
5c80: 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b     db->next_cook
5c90: 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ie = db->aDb[0].
5ca0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20  schema_cookie + 
5cb0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65  sqliteRandomByte
5cc0: 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e  () + 1;.    db->
5cd0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
5ce0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
5cf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5d00: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5d10: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
5d20: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
5d30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5d40: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30  _SetCookie, 0, 0
5d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5d60: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
5d70: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
5d80: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
5d90: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
5da0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
5db0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
5dc0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
5dd0: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
5de0: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
5df0: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
5e00: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
5e10: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
5e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
5e30: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
5e40: 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20  eedQuote = 0;.  
5e50: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
5e60: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
5e70: 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b  *z=='\'' ){ n++;
5e80: 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a   needQuote=1; }.
5e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
5ea0: 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a   needQuote*2;.}.
5eb0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5ec0: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
5ed0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
5ee0: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
5ef0: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
5f00: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
5f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f20: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
5f30: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
5f40: 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e  r *zIdent){.  in
5f50: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
5f60: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
5f70: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
5f80: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
5f90: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
5fa0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
5fb0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
5fc0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
5fd0: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
5fe0: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
5ff0: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
6000: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
6010: 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65 28  liteKeywordCode(
6020: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
6030: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
6040: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  te ) z[i++] = '\
6050: 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  '';.  for(j=0; z
6060: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
6070: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
6080: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
6090: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20  zIdent[j]=='\'' 
60a0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
60b0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
60c0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
60d0: 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30  '\'';.  z[i] = 0
60e0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
60f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6100: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6110: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
6120: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
6130: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
6140: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
6150: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
6160: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
6170: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
6180: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
6190: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
61a0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
61b0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
61c0: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
61d0: 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b  eStmt(Table *p){
61e0: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
61f0: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
6200: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
6210: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20  ep2, *zEnd;.  n 
6220: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
6230: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
6240: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
6250: 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d  ength(p->aCol[i]
6260: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  .zName);.  }.  n
6270: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
6280: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
6290: 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<40 ){.    zSe
62a0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
62b0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
62c0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
62d0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
62e0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
62f0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
6300: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
6310: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
6320: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
6330: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
6340: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
6350: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
6360: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
6370: 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43  , p->iDb==1 ? "C
6380: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
6390: 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41 42   " : "CREATE TAB
63a0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72  LE ");.  k = str
63b0: 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  len(zStmt);.  id
63c0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
63d0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
63e0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
63f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6400: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6410: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
6420: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
6430: 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74  += strlen(&zStmt
6440: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
6450: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
6460: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
6470: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
6480: 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28  );.  }.  strcpy(
6490: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
64a0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
64b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
64c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
64d0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
64e0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
64f0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
6500: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6510: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
6520: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
6530: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
6540: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
6550: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
6560: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
6570: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
6580: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
6590: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
65a0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
65b0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
65c0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
65d0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
65e0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a  table on disk,.*
65f0: 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73  * unless this is
6600: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
6610: 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d  le or initFlag==
6620: 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46 6c 61  1.  When initFla
6630: 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e  g==1,.** it mean
6640: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
6650: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6660: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
6670: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
6680: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
6690: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
66a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
66b0: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
66c0: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  recently changes
66d0: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
66e0: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
66f0: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
6700: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
6710: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
6720: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
6730: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
6740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
6750: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
6760: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
6770: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
6780: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
6790: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
67a0: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
67b0: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
67c0: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
67d0: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
67e0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
67f0: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
6800: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
6810: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
6820: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
6830: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
6840: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72  liteEndTable(Par
6850: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
6860: 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20  n *pEnd, Select 
6870: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
6880: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20  le *p;.  sqlite 
6890: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
68a0: 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  ;..  if( (pEnd==
68b0: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
68c0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
68d0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
68e0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
68f0: 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  n;.  p = pParse-
6900: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
6910: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
6920: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
6930: 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ble is generated
6940: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20   from a SELECT, 
6950: 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74  then construct t
6960: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20  he.  ** list of 
6970: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
6980: 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c  text of the tabl
6990: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
69a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62  elect ){.    Tab
69b0: 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71  le *pSelTab = sq
69c0: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
69d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
69e0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69   pSelect);.    i
69f0: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
6a00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65  return;.    asse
6a10: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
6a20: 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20  ;.    p->nCol = 
6a30: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
6a40: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
6a50: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
6a60: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
6a70: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
6a80: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
6a90: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
6aa0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d  0, pSelTab);.  }
6ab0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e  ..  /* If the in
6ac0: 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d  itFlag is 1 it m
6ad0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6ae0: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
6af0: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
6b00: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
6b10: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
6b20: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
6b30: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
6b40: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
6b50: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
6b60: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
6b70: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
6b80: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
6b90: 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65  m the pParse->ne
6ba0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
6bb0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
6bc0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
6bd0: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
6be0: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
6bf0: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
6c00: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
6c10: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6c20: 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65  p->tnum = pParse
6c30: 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  ->newTnum;.  }..
6c40: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
6c50: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
6c60: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
6c70: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
6c80: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
6c90: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
6ca0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6cb0: 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  .  The record nu
6cc0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
6cd0: 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72  e new table entr
6ce0: 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  y should already
6cf0: 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b   be on the stack
6d00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
6d10: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
6d20: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
6d30: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
6d40: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
6d50: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
6d60: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
6d70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
6d80: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
6d90: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
6da0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
6db0: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
6dc0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
6dd0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
6de0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6df0: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
6e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6e10: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
6e20: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
6e30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6e40: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
6e50: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  ->iDb);.      sq
6e60: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6e70: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
6e80: 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  &p->tnum, P3_POI
6e90: 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NTER);.    }else
6ea0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
6eb0: 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
6ec0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6ed0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6ee0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
6ef0: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  um = 0;.    sqli
6f00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6f10: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
6f20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6f30: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6f40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6f50: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
6f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6f70: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6f80: 20 22 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41   "table", P3_STA
6f90: 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TIC);.    }else{
6fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6fb0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6fc0: 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54   "view", P3_STAT
6fd0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  IC);.    }.    s
6fe0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6ff0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
7000: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
7010: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
7020: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
7030: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
7040: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7050: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7060: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
7070: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
7080: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
7090: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
70a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
70b0: 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73  up, 4, 0);.    s
70c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
70d0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
70e0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  0);.    if( pSel
70f0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ect ){.      cha
7100: 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62  r *z = createTab
7110: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20  leStmt(p);.     
7120: 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28   n = z ? strlen(
7130: 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71  z) : 0;.      sq
7140: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
7150: 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  (v, -1, z, n);. 
7160: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7170: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
7180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
7190: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20  d!=0 );.      n 
71a0: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
71b0: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
71c0: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20  FirstToken.z) + 
71d0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  1;.      sqliteV
71e0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
71f0: 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73  1, pParse->sFirs
7200: 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20  tToken.z, n);.  
7210: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
7220: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
7230: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
7240: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
7250: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
7260: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
7270: 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29 7b 0a   if( !p->iDb ){.
7280: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
7290: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
72a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
72b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
72c0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
72d0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
72e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
72f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
7300: 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30  teger, p->iDb, 0
7310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
7330: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
7340: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
7350: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
7360: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
7370: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54  se, pSelect, SRT
7380: 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c  _Table, 1, 0, 0,
7390: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
73a0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
73b0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
73c0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
73d0: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
73e0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
73f0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7400: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
7410: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
7420: 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ain==0 && pParse
7430: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
7440: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
7450: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
7460: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
7470: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
7480: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48  aDb[p->iDb].tblH
7490: 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c    p->zName, strl
74c0: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
74d0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
74e0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
74f0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
7500: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
7510: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
7520: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
7530: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7540: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65    }.    for(pFKe
7550: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
7560: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
7570: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
7580: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
7590: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
75a0: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
75b0: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
75c0: 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  eHashFind(&db->a
75d0: 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  Db[p->iDb].aFKey
75e0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
75f0: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
7600: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
7610: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
7620: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
7630: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
7640: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
7650: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
7660: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
7670: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
7680: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
7690: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
76a0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
76b0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
76c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
76d0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
76e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
76f0: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
7700: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
7710: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
7720: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
7730: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
7740: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
7750: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
7760: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7770: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
7780: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
7790: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
77a0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
77b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
77c0: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
77d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
77e0: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
77f0: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
7800: 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20   int isTemp     
7810: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
7820: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
7830: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
7840: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
7850: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  nst char *z;.  T
7860: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 0a 20 20 73 71  oken sEnd;..  sq
7870: 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 70  liteStartTable(p
7880: 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70  Parse, pBegin, p
7890: 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20 31 29  Name, isTemp, 1)
78a0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
78b0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
78c0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
78d0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
78e0: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
78f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
7900: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
7910: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
7920: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
7930: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
7940: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
7950: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
7960: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
7970: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
7980: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
7990: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
79a0: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
79b0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
79c0: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
79d0: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
79e0: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
79f0: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
7a00: 72 72 65 6e 74 20 73 71 6c 69 74 65 5f 65 78 65  rrent sqlite_exe
7a10: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
7a20: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c  ..  */.  p->pSel
7a30: 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65  ect = sqliteSele
7a40: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
7a50: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
7a60: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
7a70: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
7a80: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  itFlag ){.    sq
7a90: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
7aa0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
7ab0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
7ac0: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
7ad0: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
7ae0: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
7af0: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
7b00: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
7b10: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
7b20: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
7b30: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
7b40: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
7b50: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
7b60: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
7b70: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
7b80: 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a  n = ((int)sEnd.z
7b90: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
7ba0: 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  >z;.  z = pBegin
7bb0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
7bc0: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
7bd0: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
7be0: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
7bf0: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
7c00: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
7c10: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
7c20: 74 65 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  teEndTable() to 
7c30: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
7c40: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7c50: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
7c60: 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72  iteEndTable(pPar
7c70: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
7c80: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
7c90: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
7ca0: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
7cb0: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
7cc0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
7cd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
7ce0: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
7cf0: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
7d00: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
7d10: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
7d20: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
7d30: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
7d40: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
7d50: 73 73 61 67 65 20 69 6e 20 70 50 61 72 65 2d 3e  ssage in pPare->
7d60: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
7d70: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
7d80: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
7d90: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
7da0: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
7db0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
7dc0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
7dd0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
7de0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
7df0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
7e00: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
7e10: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
7e20: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
7e30: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
7e40: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
7e50: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
7e60: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
7e70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
7e80: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
7e90: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
7ea0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
7eb0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
7ec0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
7ed0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
7ee0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
7ef0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
7f00: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
7f10: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
7f20: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
7f30: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
7f40: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
7f50: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
7f60: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
7f70: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
7f80: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
7f90: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
7fa0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
7fb0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
7fc0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
7fd0: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
7fe0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
7ff0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
8000: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
8010: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
8020: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
8030: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
8040: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
8050: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
8060: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
8070: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
8080: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
8090: 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61 62  g, "view ", pTab
80a0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
80b0: 20 20 20 20 22 20 69 73 20 63 69 72 63 75 6c 61      " is circula
80c0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30 29  rly defined", 0)
80d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
80e0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
80f0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   1;.  }..  /* If
8100: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
8110: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
8120: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
8130: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
8140: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
8150: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
8160: 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20   /* If nCol==0, 
8170: 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74  then pTable must
8180: 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   be a VIEW */.  
8190: 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70  pSel = pTable->p
81a0: 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f  Select;..  /* No
81b0: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
81c0: 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c 74   to sqliteResult
81d0: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
81e0: 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
81f0: 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
8200: 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42  in this list.  B
8210: 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ut we will need 
8220: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c  to restore the l
8230: 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f  ist.  ** back to
8240: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
8250: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65  nfiguration afte
8260: 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61  rwards, so we sa
8270: 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a  ve a copy of.  *
8280: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  * the original i
8290: 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20  n pEList..  */. 
82a0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e   pEList = pSel->
82b0: 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e  pEList;.  pSel->
82c0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45  pEList = sqliteE
82d0: 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73  xprListDup(pELis
82e0: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  t);.  if( pSel->
82f0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
8300: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
8310: 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75  pEList;.    retu
8320: 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 1;  /* Malloc
8330: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
8340: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
8350: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
8360: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
8370: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
8380: 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20  0, pSel);.  if( 
8390: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61  pSelTab ){.    a
83a0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
83b0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  Col==0 );.    pT
83c0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
83d0: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
83e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
83f0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
8400: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
8410: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
8420: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
8430: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
8440: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
8450: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
8460: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
8470: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8480: 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
8490: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
84a0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
84b0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
84c0: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
84d0: 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74  d(pSel);.  sqlit
84e0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
84f0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSel->pEList);. 
8500: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
8510: 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  pEList;.  return
8520: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
8530: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
8540: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
8550: 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a  e VIEW pTable..*
8560: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8570: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
8580: 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74  ever any other t
8590: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
85a0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65  modified..** The
85b0: 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74   view passed int
85c0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  o this routine m
85d0: 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65  ight depend dire
85e0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
85f0: 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64  ly.** on the mod
8600: 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64  ified or deleted
8610: 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65   table so we nee
8620: 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f  d to clear the o
8630: 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d  ld column.** nam
8640: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  es so that they 
8650: 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74  will be recomput
8660: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8670: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
8680: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
8690: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
86a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61  int i;.  if( pTa
86b0: 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ble==0 || pTable
86c0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72  ->pSelect==0 ) r
86d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61  eturn;.  if( pTa
86e0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72  ble->nCol==0 ) r
86f0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8700: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
8710: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
8720: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
8730: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
8740: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
8750: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  able->aCol[i].zD
8760: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
8770: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
8780: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d  l[i].zType);.  }
8790: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
87a0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  able->aCol);.  p
87b0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
87c0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
87d0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
87e0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
87f0: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
8800: 56 49 45 57 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  VIEW..*/.static 
8810: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
8820: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a  esetAll(sqlite *
8830: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
8840: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
8850: 66 28 20 28 64 62 2d 3e 61 44 62 5b 69 64 78 5d  f( (db->aDb[idx]
8860: 2e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  .flags & SQLITE_
8870: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3d 3d 30  UnresetViews)==0
8880: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8890: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
88a0: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
88b0: 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  .tblHash); i; i=
88c0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
88d0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
88e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
88f0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
8900: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
8910: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69  {.      sqliteVi
8920: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
8930: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
8940: 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 69 64    }.  db->aDb[id
8950: 78 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  x].flags &= ~SQL
8960: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
8970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
8980: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
8990: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
89a0: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
89b0: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
89c0: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
89d0: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
89e0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
89f0: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
8a00: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
8a10: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8a20: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20   Token *pTok){. 
8a30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
8a40: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a  Table *pTab;.  z
8a50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
8a60: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
8a70: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
8a80: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
8a90: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
8aa0: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
8ab0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  e->db, zName, 0)
8ac0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
8ad0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
8ae0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
8af0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
8b00: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8b10: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
8b20: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54  , 0, .        pT
8b30: 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20  ok->z, pTok->n, 
8b40: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
8b50: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
8b60: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
8b70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8b80: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
8b90: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
8ba0: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
8bb0: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
8bc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8bd0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
8be0: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
8bf0: 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61  liteDropTable(Pa
8c00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8c10: 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  en *pName, int i
8c20: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
8c30: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
8c40: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
8c50: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
8c60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
8c70: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
8c80: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
8c90: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
8ca0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  d ) return;.  pT
8cb0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62  able = sqliteTab
8cc0: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
8cd0: 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  se, pName);.  if
8ce0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
8cf0: 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54  turn;.  iDb = pT
8d00: 61 62 6c 65 2d 3e 69 44 62 3b 0a 23 69 66 6e 64  able->iDb;.#ifnd
8d10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8d20: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
8d30: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
8d40: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
8d50: 45 5f 44 45 4c 45 54 45 2c 20 53 43 48 45 4d 41  E_DELETE, SCHEMA
8d60: 5f 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69  _TABLE(pTable->i
8d70: 44 62 29 2c 30 29 29 7b 0a 20 20 20 20 72 65 74  Db),0)){.    ret
8d80: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20  urn;.  }.  {.   
8d90: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 69   int code;.    i
8da0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
8db0: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
8dc0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
8dd0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
8de0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
8df0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
8e00: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
8e10: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
8e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
8e30: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
8e40: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
8e50: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
8e60: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
8e70: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
8e80: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
8e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8ea0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
8eb0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
8ec0: 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  code, pTable->zN
8ed0: 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
8ee0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8ef0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
8f00: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
8f10: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
8f20: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20  able->zName, 0) 
8f30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
8f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8f50: 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  f.  if( pTable->
8f60: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
8f70: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
8f80: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
8f90: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
8fa0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  le->zName, .    
8fb0: 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20     " may not be 
8fc0: 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
8fd0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8fe0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8ff0: 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  }.  if( isView &
9000: 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  & pTable->pSelec
9010: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
9020: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
9030: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
9040: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
9050: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c   delete table ",
9060: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a  .      pTable->z
9070: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
9080: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
9090: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
90a0: 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
90b0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
90c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
90d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
90e0: 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f  ErrMsg, "use DRO
90f0: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
9100: 20 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70   view ",.      p
9110: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
9120: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
9130: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
9140: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
9150: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
9160: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
9170: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
9180: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
9190: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
91a0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
91b0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
91c0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
91d0: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
91e0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
91f0: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
9200: 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  8),  0},.      {
9210: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
9220: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
9230: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
9240: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
9250: 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
9260: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
9270: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
9280: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
9290: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
92a0: 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  mn,     0, 2,   
92b0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
92c0: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
92d0: 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c  0, ADDR(7),  0},
92e0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
92f0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
9300: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9310: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
9320: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
9330: 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 7 */.    };.
9340: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9350: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
9360: 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  rigger;.    sqli
9370: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
9380: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
9390: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20   pTable->iDb);. 
93a0: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
93b0: 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61 62  terTable(v, pTab
93c0: 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 2f 2a  le->iDb);.    /*
93d0: 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
93e0: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
93f0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
9400: 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20  ng dropped */.  
9410: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
9420: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  ble->pTrigger;. 
9430: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
9440: 65 72 20 29 7b 0a 20 20 20 20 20 20 53 72 63 4c  er ){.      SrcL
9450: 69 73 74 20 2a 70 4e 6d 3b 0a 20 20 20 20 20 20  ist *pNm;.      
9460: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
9470: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
9480: 44 62 20 29 3b 0a 20 20 20 20 20 20 70 4e 6d 20  Db );.      pNm 
9490: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  = sqliteSrcListA
94a0: 70 70 65 6e 64 28 30 2c 20 30 2c 20 30 29 3b 0a  ppend(0, 0, 0);.
94b0: 20 20 20 20 20 20 70 4e 6d 2d 3e 61 5b 30 5d 2e        pNm->a[0].
94c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
94d0: 72 44 75 70 28 70 54 72 69 67 67 65 72 2d 3e 6e  rDup(pTrigger->n
94e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 6d 2d  ame);.      pNm-
94f0: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 20  >a[0].zDatabase 
9500: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 64  = sqliteStrDup(d
9510: 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69  b->aDb[pTable->i
9520: 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db].zName);.    
9530: 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67    sqliteDropTrig
9540: 67 65 72 28 70 50 61 72 73 65 2c 20 70 4e 6d 2c  ger(pParse, pNm,
9550: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
9560: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
9570: 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67  {.        pTrigg
9580: 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
9590: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
95a0: 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  e{.        pTrig
95b0: 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  ger = pTable->pT
95c0: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
95d0: 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d      }.    base =
95e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
95f0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
9600: 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72  e(dropTable), dr
9610: 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71  opTable);.    sq
9620: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
9630: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62  (v, base+1, pTab
9640: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
9650: 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e     if( !pTable->
9660: 69 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iDb ){.      sql
9670: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
9680: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
9690: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
96a0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
96b0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69  , 0);.    if( !i
96c0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
96d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
96e0: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54  , OP_Destroy, pT
96f0: 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  able->tnum, pTab
9700: 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20  le->iDb);.      
9710: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
9720: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
9730: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
9740: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9750: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9760: 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74  Destroy, pIdx->t
9770: 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  num, pTable->iDb
9780: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9790: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
97a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
97b0: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
97c0: 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65  Delete the in-me
97d0: 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e  mory description
97e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
97f0: 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
9800: 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73  on: if the SQL s
9810: 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77  tatement began w
9820: 69 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20  ith the EXPLAIN 
9830: 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68  keyword,.  ** th
9840: 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68  en no changes sh
9850: 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20  ould be made..  
9860: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
9870: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
9880: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
9890: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
98a0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d  pTable);.    db-
98b0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
98c0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
98d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
98e0: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
98f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
9900: 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75   routine constru
9910: 63 74 73 20 61 20 50 33 20 73 74 72 69 6e 67 20  cts a P3 string 
9920: 73 75 69 74 61 62 6c 65 20 66 6f 72 20 61 6e 20  suitable for an 
9930: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a  OP_MakeIdxKey.**
9940: 20 6f 70 63 6f 64 65 20 61 6e 64 20 61 64 64 73   opcode and adds
9950: 20 74 68 61 74 20 50 33 20 73 74 72 69 6e 67 20   that P3 string 
9960: 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  to the most rece
9970: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
9980: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20  struction.** in 
9990: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
99a0: 69 6e 65 2e 20 20 54 68 65 20 50 33 20 73 74 72  ine.  The P3 str
99b0: 69 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ing consists of 
99c0: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
99d0: 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63  er.** for each c
99e0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64  olumn in the ind
99f0: 65 78 20 70 49 64 78 20 6f 66 20 74 61 62 6c 65  ex pIdx of table
9a00: 20 70 54 61 62 2e 20 20 49 66 20 74 68 65 20 63   pTab.  If the c
9a10: 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20  olumn uses.** a 
9a20: 6e 75 6d 65 72 69 63 20 73 6f 72 74 20 6f 72 64  numeric sort ord
9a30: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20  er, then the P3 
9a40: 73 74 72 69 6e 67 20 63 68 61 72 61 63 74 65 72  string character
9a50: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
9a60: 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e  o.** that column
9a70: 20 69 73 20 27 6e 27 2e 20 20 49 66 20 74 68 65   is 'n'.  If the
9a80: 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20 61 20 74   column uses a t
9a90: 65 78 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20  ext sort order, 
9aa0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73  then the.** P3 s
9ab0: 74 72 69 6e 67 20 69 73 20 27 74 27 2e 20 20 53  tring is 't'.  S
9ac0: 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64  ee the OP_MakeId
9ad0: 78 4b 65 79 20 6f 70 63 6f 64 65 20 64 6f 63 75  xKey opcode docu
9ae0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  mentation for.**
9af0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
9b00: 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c  rmation.  See al
9b10: 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64  so the sqliteAdd
9b20: 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e  KeyType() routin
9b30: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
9b40: 65 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 56  eAddIdxKeyType(V
9b50: 64 62 65 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70  dbe *v, Index *p
9b60: 49 64 78 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54  Idx){.  char *zT
9b70: 79 70 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ype;.  Table *pT
9b80: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  ab;.  int i, n;.
9b90: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
9ba0: 30 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c  0 && pIdx->pTabl
9bb0: 65 21 3d 30 20 29 3b 0a 20 20 70 54 61 62 20 3d  e!=0 );.  pTab =
9bc0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9bd0: 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   n = pIdx->nColu
9be0: 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d 20 73 71  mn;.  zType = sq
9bf0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
9c00: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70  +1 );.  if( zTyp
9c10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
9c20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
9c30: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
9c40: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
9c50: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
9c60: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
9c70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
9c80: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
9c90: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f  aCol[iCol].sortO
9ca0: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
9cb0: 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49  _TYPEMASK)==SQLI
9cc0: 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20  TE_SO_TEXT ){.  
9cd0: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27      zType[i] = '
9ce0: 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t';.    }else{. 
9cf0: 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20       zType[i] = 
9d00: 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  'n';.    }.  }. 
9d10: 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zType[n] = 0;. 
9d20: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
9d30: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65  eP3(v, -1, zType
9d40: 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  , n);.  sqliteFr
9d50: 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  ee(zType);.}../*
9d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9d70: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
9d80: 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
9d90: 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
9da0: 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
9db0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9dc0: 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
9dd0: 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
9de0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
9df0: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
9e00: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
9e10: 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
9e20: 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
9e30: 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
9e40: 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
9e50: 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
9e60: 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
9e70: 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
9e80: 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
9e90: 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
9ea0: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
9eb0: 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
9ec0: 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
9ed0: 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
9ee0: 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
9ef0: 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
9f00: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
9f10: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
9f20: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
9f30: 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
9f40: 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
9f50: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
9f60: 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
9f70: 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
9f80: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
9f90: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
9fa0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9fb0: 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
9fc0: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
9fd0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9fe0: 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
9ff0: 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
a000: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
a010: 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
a020: 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
a030: 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
a040: 6e 74 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61  ntil sqliteEndTa
a050: 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
a060: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
a070: 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
a080: 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
a090: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
a0a0: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66  .** to sqliteDef
a0b0: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
a0c0: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
a0d0: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
a0e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61  .void sqliteCrea
a0f0: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
a100: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a110: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a120: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c  context */.  IdL
a130: 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
a140: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
a150: 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
a160: 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
a170: 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
a180: 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
a190: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
a1a0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49  her table */.  I
a1b0: 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  dList *pToCol,  
a1c0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
a1d0: 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
a1e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a200: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
a210: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
a220: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  /.){.  Table *p 
a230: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a240: 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
a250: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
a260: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
a270: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  ;.  FKey *pFKey 
a280: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
a290: 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
a2a0: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
a2b0: 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65  nErr ) goto fk_e
a2c0: 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
a2d0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
a2e0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
a2f0: 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  1;.    if( iCol<
a300: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
a310: 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
a320: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d  && pToCol->nId!=
a330: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
a340: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
a350: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66  rse->zErrMsg, "f
a360: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c  oreign key on ",
a370: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70 2d   -1,.         p-
a380: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
a390: 65 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  e, -1, .        
a3a0: 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
a3b0: 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
a3c0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 22 2c 20  umn of table ", 
a3d0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70 54 6f  -1,.         pTo
a3e0: 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b  ->z, pTo->n, 0);
a3f0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
a400: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74  Err++;.      got
a410: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
a420: 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
a430: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
a440: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21   && pToCol->nId!
a450: 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29  =pFromCol->nId )
a460: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
a470: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
a480: 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20  ErrMsg, .       
a490: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
a4a0: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
a4b0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
a4c0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
a4d0: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
a4e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
a4f0: 6e 63 65 64 20 74 61 62 6c 65 22 2c 20 30 29 3b  nced table", 0);
a500: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
a510: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  r++;.    goto fk
a520: 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
a530: 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
a540: 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e  ol->nId;.  }.  n
a550: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
a560: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
a570: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
a580: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
a590: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
a5a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
a5b0: 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b  <pToCol->nId; i+
a5c0: 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
a5d0: 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c  += strlen(pToCol
a5e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
a5f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
a600: 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  FKey = sqliteMal
a610: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
a620: 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67  if( pFKey==0 ) g
a630: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46  oto fk_end;.  pF
a640: 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
a650: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
a660: 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
a670: 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
a680: 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  ey[1];.  pFKey->
a690: 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73  aCol = (struct s
a6a0: 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b  ColMap*)z;.  z +
a6b0: 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  = sizeof(struct 
a6c0: 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20  sColMap)*nCol;. 
a6d0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
a6e0: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
a6f0: 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
a700: 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
a710: 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
a720: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
a730: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e   = 0;.  pFKey->n
a740: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
a750: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
a760: 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
a770: 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
a780: 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
a790: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a7a0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
a7b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
a7c0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
a7d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a7e0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
a7f0: 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
a800: 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
a810: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
a820: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
a830: 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
a840: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
a850: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a870: 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
a880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
a890: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
a8a0: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77  zErrMsg, "unknow
a8b0: 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20  n column \"", . 
a8c0: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
a8d0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22  l->a[i].zName, "
a8e0: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
a8f0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30  y definition", 0
a900: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
a910: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
a920: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
a930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a940: 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
a950: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
a960: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
a970: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
a980: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
a990: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
a9a0: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
a9b0: 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
a9c0: 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
a9d0: 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
a9e0: 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
a9f0: 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
aa00: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
aa10: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
aa20: 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
aa30: 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
aa40: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
aa50: 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
aa60: 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
aa70: 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
aa80: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
aa90: 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
aaa0: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
aab0: 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
aac0: 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
aad0: 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
aae0: 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
aaf0: 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
ab00: 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
ab10: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71  ree(pFKey);.  sq
ab20: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
ab30: 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71  (pFromCol);.  sq
ab40: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
ab50: 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (pToCol);.}../*.
ab60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ab70: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
ab80: 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
ab90: 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
aba0: 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
abb0: 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
abc0: 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
abd0: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
abe0: 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
abf0: 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
ac00: 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
ac10: 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
ac20: 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
ac30: 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
ac40: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
ac50: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
ac60: 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
ac70: 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
ac80: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
ac90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65  */.void sqliteDe
aca0: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
acb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
acc0: 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20   isDeferred){.  
acd0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
ace0: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
acf0: 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
ad00: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
ad10: 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
ad20: 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
ad30: 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
ad40: 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
ad50: 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ferred;.}../*.**
ad60: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
ad70: 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
ad80: 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73  able.  pIndex is
ad90: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ada0: 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
adb0: 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  Table is the nam
adc0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
add0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
ade0: 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
adf0: 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
ae00: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
ae10: 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
ae20: 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
ae30: 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
ae40: 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
ae50: 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
ae60: 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
ae70: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
ae80: 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
ae90: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
aea0: 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
aeb0: 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
aec0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
aed0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
aee0: 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
aef0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
af00: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
af10: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
af20: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
af30: 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
af40: 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
af50: 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
af60: 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
af70: 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
af80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
af90: 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
afa0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
afb0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
afc0: 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69  uction.  .*/.voi
afd0: 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e  d sqliteCreateIn
afe0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
aff0: 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69  arse,   /* All i
b000: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
b010: 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
b020: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
b030: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
b040: 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20   index.  May be 
b050: 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
b060: 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a 20 4e 61  t *pTable, /* Na
b070: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
b080: 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70  to index.  Use p
b090: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b0a0: 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73   if 0 */.  IdLis
b0b0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
b0c0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
b0d0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
b0e0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
b0f0: 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
b100: 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
b110: 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
b120: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  one */.  int isT
b130: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
b140: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  e if this is a t
b150: 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a  emporary index *
b160: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
b170: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
b180: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
b190: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
b1a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
b1b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
b1c0: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
b1d0: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
b1e0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
b1f0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
b200: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
b210: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
b220: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
b230: 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54   *pIndex;   /* T
b240: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
b250: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
b260: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
b270: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
b280: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
b290: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
b2a0: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
b2b0: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c  ID list */.  sql
b2c0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
b2d0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
b2e0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
b2f0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
b300: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
b310: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
b320: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
b330: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
b340: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
b350: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
b360: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
b370: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
b380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
b390: 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me!=0 );.    ass
b3a0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72  ert( pTable->nSr
b3b0: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
b3c0: 20 3d 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73   =  sqliteSrcLis
b3d0: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
b3e0: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
b3f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
b400: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
b410: 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
b420: 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
b430: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
b440: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
b450: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b460: 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
b470: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
b480: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
b490: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b4a0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
b4b0: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
b4c0: 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  " may not be ind
b4d0: 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  exed", 0);.    p
b4e0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
b4f0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
b500: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
b510: 20 69 66 28 20 21 69 73 54 65 6d 70 20 26 26 20   if( !isTemp && 
b520: 70 54 61 62 2d 3e 69 44 62 3e 3d 32 20 26 26 20  pTab->iDb>=2 && 
b530: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
b540: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b550: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b560: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
b570: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
b580: 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79  me, .      " may
b590: 20 6e 6f 74 20 68 61 76 65 20 6e 6f 6e 2d 74 65   not have non-te
b5a0: 6d 70 6f 72 61 72 79 20 69 6e 64 69 63 65 73 20  mporary indices 
b5b0: 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  added", 0);.    
b5c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
b5d0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b5e0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
b5f0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
b600: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
b610: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b620: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69  se->zErrMsg, "vi
b630: 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
b640: 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20  ndexed", 0);.   
b650: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
b660: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
b670: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
b680: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 44 62  .  if( pTab->iDb
b690: 3d 3d 31 20 29 7b 0a 20 20 20 20 69 73 54 65 6d  ==1 ){.    isTem
b6a0: 70 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  p = 1;.  }..  /*
b6b0: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
b6c0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
b6d0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
b6e0: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
b6f0: 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
b700: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
b710: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
b720: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
b730: 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
b740: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
b750: 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
b760: 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
b770: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
b780: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
b790: 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
b7a0: 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
b7b0: 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
b7c0: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
b7d0: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
b7e0: 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
b7f0: 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
b800: 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
b810: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
b820: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
b830: 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
b840: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
b850: 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
b860: 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
b870: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
b880: 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
b890: 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
b8a0: 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
b8b0: 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
b8c0: 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
b8d0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20  .  if( pName && 
b8e0: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
b8f0: 67 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  g ){.    Index *
b900: 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pISameName;    /
b910: 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20  * Another index 
b920: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
b930: 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  me */.    Table 
b940: 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pTSameName;    
b950: 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20  /* A table with 
b960: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
b970: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e   index */.    zN
b980: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
b990: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
b9a0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
b9b0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
b9c0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
b9d0: 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53  ex;.    if( (pIS
b9e0: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
b9f0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
ba00: 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  ame, 0))!=0 ){. 
ba10: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
ba20: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
ba30: 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22 2c  rrMsg, "index ",
ba40: 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20   zName, .       
ba50: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
ba60: 74 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ts", 0);.      p
ba70: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
ba80: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
ba90: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
baa0: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53 61   }.    if( (pTSa
bab0: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
bac0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
bad0: 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20  me, 0))!=0 ){.  
bae0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
baf0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
bb00: 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20  rMsg, "there is 
bb10: 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
bb20: 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20  named ",.       
bb30: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
bb40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
bb50: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  +;.      goto ex
bb60: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
bb70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
bb80: 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( pName==0 ){. 
bb90: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
bba0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
bbb0: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
bbc0: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
bbd0: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
bbe0: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
bbf0: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
bc00: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
bc10: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
bc20: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
bc30: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
bc40: 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61  &zName, "(", pTa
bc50: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f  b->zName, " auto
bc60: 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30  index ", zBuf, 0
bc70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
bc80: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
bc90: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
bca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
bcb0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
bcc0: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
bcd0: 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ->n);.  }..  /* 
bce0: 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
bcf0: 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
bd00: 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
bd10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd20: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
bd30: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54  ON.  assert( isT
bd40: 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  emp==0 || isTemp
bd50: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
bd60: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 70 50 61 72   pTab->iDb==pPar
bd70: 73 65 2d 3e 69 44 62 20 7c 7c 20 69 73 54 65 6d  se->iDb || isTem
bd80: 70 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  p==1 );.  if( sq
bd90: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
bda0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
bdb0: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
bdc0: 45 28 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b  E(isTemp), 0) ){
bdd0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
bde0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
bdf0: 0a 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52  .  i = SQLITE_CR
be00: 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 69 66  EATE_INDEX;.  if
be10: 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53  ( isTemp ) i = S
be20: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
be30: 50 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28 20 73  P_INDEX;.  if( s
be40: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
be50: 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
be60: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b   pTab->zName) ){
be70: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
be80: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
be90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
bea0: 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
beb0: 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
bec0: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
bed0: 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
bee0: 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
bef0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
bf00: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
bf10: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
bf20: 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
bf30: 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
bf40: 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
bf50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
bf60: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
bf70: 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43  lId.z = pTab->aC
bf80: 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
bf90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
bfa0: 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75  Id.n = strlen(nu
bfb0: 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69  llId.z);.    pLi
bfc0: 73 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73  st = sqliteIdLis
bfd0: 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c  tAppend(0, &null
bfe0: 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  Id);.    if( pLi
bff0: 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
c000: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c010: 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
c020: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
c030: 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
c040: 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   */.  pIndex = s
c050: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
c060: 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72  eof(Index) + str
c070: 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b  len(zName) + 1 +
c080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c090: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
c0a0: 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20  int)*pList->nId 
c0b0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
c0c0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
c0d0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
c0e0: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
c0f0: 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b  = (int*)&pIndex[
c100: 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  1];.  pIndex->zN
c110: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
c120: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
c130: 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74  List->nId];.  st
c140: 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rcpy(pIndex->zNa
c150: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49  me, zName);.  pI
c160: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
c170: 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
c180: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
c190: 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  nId;.  pIndex->o
c1a0: 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
c1b0: 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f 6e 45 72  >isUnique = onEr
c1c0: 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
c1d0: 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
c1e0: 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  ==0;.  pIndex->i
c1f0: 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20  Db = isTemp ? 1 
c200: 3a 20 70 50 61 72 73 65 2d 3e 69 44 62 3b 0a 0a  : pParse->iDb;..
c210: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
c220: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
c230: 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
c240: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
c250: 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
c260: 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
c270: 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
c280: 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
c290: 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
c2a0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
c2b0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
c2c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
c2d0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
c2e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
c2f0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
c300: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c310: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
c320: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
c330: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d  >aCol[j].zName)=
c340: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c350: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
c360: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
c370: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
c380: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
c390: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
c3a0: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
c3b0: 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75     " has no colu
c3c0: 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73  mn named ", pLis
c3d0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30  t->a[i].zName, 0
c3e0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
c3f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73  >nErr++;.      s
c400: 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
c410: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
c420: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c430: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
c440: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
c450: 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69   j;.  }..  /* Li
c460: 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
c470: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
c480: 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
c490: 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
c4a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
c4b0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
c4c0: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
c4d0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
c4e0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
c4f0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
c500: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 73 54  ert(&db->aDb[isT
c510: 65 6d 70 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20  emp].idxHash, . 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
c540: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
c550: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
c560: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
c570: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
c580: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
c590: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
c5a0: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
c5b0: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
c5c0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
c5d0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c5e0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
c5f0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
c600: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
c610: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
c620: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
c630: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
c640: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
c650: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
c660: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
c670: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
c680: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
c690: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
c6a0: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
c6b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
c6c0: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
c6d0: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
c6e0: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
c6f0: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
c700: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
c710: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
c720: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
c730: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
c740: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
c750: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
c760: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
c770: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
c780: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
c790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
c7a0: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
c7b0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
c7c0: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
c7d0: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
c7e0: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
c7f0: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
c800: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
c810: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
c820: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
c830: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
c840: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
c850: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
c860: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
c870: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
c880: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
c890: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
c8a0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
c8b0: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
c8c0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
c8d0: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
c8e0: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
c8f0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
c900: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
c910: 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  r from the pPars
c920: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
c930: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
c940: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
c950: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
c960: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
c970: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
c980: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c990: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
c9a0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
c9b0: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
c9c0: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
c9d0: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
c9e0: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
c9f0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
ca00: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
ca10: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
ca20: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
ca30: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
ca40: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
ca50: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
ca60: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
ca70: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
ca80: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
ca90: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
caa0: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
cab0: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
cac0: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
cad0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
cae0: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
caf0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
cb00: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
cb10: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
cb20: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
cb30: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
cb40: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
cb50: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
cb60: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
cb70: 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d  .  ** If pTable=
cb80: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
cb90: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
cba0: 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
cbb0: 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
cbc0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
cbd0: 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
cbe0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
cbf0: 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
cc00: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
cc10: 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
cc20: 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
cc30: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
cc40: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
cc50: 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
cc60: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
cc70: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
cc80: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
cc90: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
cca0: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
ccb0: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
ccc0: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
ccd0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47  .    v = sqliteG
cce0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ccf0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
cd00: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
cd10: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  index;.    if( p
cd20: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
cd30: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
cd40: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
cd50: 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  se, 0, isTemp);.
cd60: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e        sqliteOpen
cd70: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69  MasterTable(v, i
cd80: 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sTemp);.    }.  
cd90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cda0: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
cdb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
cdc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cdd0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
cde0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
cdf0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
ce00: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
ce10: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
ce20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ce30: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
ce40: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
ce50: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64  geP3(v, -1, pInd
ce60: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ex->zName, P3_ST
ce70: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
ce80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ce90: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
cea0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
ceb0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
cec0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
ced0: 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72 20  ATIC);.    addr 
cee0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
cef0: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
cf00: 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  dex, 0, isTemp);
cf10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
cf20: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
cf30: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
cf40: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
cf50: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
cf60: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
cf70: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
cf80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cf90: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
cfa0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
cfb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cfc0: 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c  Integer, isTemp,
cfd0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
cfe0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cff0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
d000: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
d010: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
d020: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
d030: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
d040: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
d050: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  ){.      n = Add
d060: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
d070: 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31  r(pStart->z) + 1
d080: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d090: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
d0a0: 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e  dr, pStart->z, n
d0b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
d0c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d0d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
d0e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
d0f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d100: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
d110: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
d120: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d140: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
d150: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
d160: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d170: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32 2c   OP_OpenRead, 2,
d180: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
d190: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
d1a0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
d1b0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
d1c0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c  ATIC);.      lbl
d1d0: 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  2 = sqliteVdbeMa
d1e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d1f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d200: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
d210: 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  2, lbl2);.      
d220: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
d230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
d240: 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  no, 2, 0);.     
d250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
d260: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
d270: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d280: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d290: 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64  _Column, 2, pInd
d2a0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  ex->aiColumn[i])
d2b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d2c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d2d0: 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  v, OP_MakeIdxKey
d2e0: 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
d2f0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
d300: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
d310: 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 49  >=4 ) sqliteAddI
d320: 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70 49 6e  dxKeyType(v, pIn
d330: 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dex);.      sqli
d340: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d350: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
d360: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
d370: 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  _None);.      sq
d380: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
d390: 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 65 64  (v, -1, "indexed
d3a0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
d3b0: 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41   unique", P3_STA
d3c0: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
d3d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d3e0: 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29  P_Next, 2, lbl1)
d3f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d400: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d410: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73  , lbl2);.      s
d420: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d430: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30  , OP_Close, 2, 0
d440: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
d450: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d460: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
d470: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c   }.    if( pTabl
d480: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e!=0 ){.      if
d490: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
d4a0: 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67       sqliteChang
d4b0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
d4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d4d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d4e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
d4f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e  ;.      sqliteEn
d500: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
d510: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
d520: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
d530: 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
d540: 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
d550: 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49  index:.  sqliteI
d560: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
d570: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  t);.  sqliteSrcL
d580: 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  istDelete(pTable
d590: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
d5a0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d5c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
d5d0: 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
d5e0: 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
d5f0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
d600: 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
d610: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
d620: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
d630: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
d640: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
d650: 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
d660: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
d670: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
d680: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d690: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
d6a0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
d6b0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
d6c0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
d6d0: 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
d6e0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
d6f0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
d700: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
d710: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
d720: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
d730: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
d740: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
d750: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
d760: 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
d770: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f  Name, 0);.    go
d780: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
d790: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
d7a0: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
d7b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
d7c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
d7d0: 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
d7e0: 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
d7f0: 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
d800: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
d810: 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
d820: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
d830: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
d840: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
d850: 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  x->iDb>1 ){.    
d860: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
d870: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61  Parse, "cannot a
d880: 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61  lter schema of a
d890: 74 74 61 63 68 65 64 20 22 0a 20 20 20 20 20 20  ttached ".      
d8a0: 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 30 29   "databases", 0)
d8b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
d8c0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
d8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d8e0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
d8f0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
d900: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
d910: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
d920: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
d930: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  ->pTable;.    if
d940: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
d950: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
d960: 5f 44 45 4c 45 54 45 2c 20 53 43 48 45 4d 41 5f  _DELETE, SCHEMA_
d970: 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44  TABLE(pIndex->iD
d980: 62 29 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  b), 0) ){.      
d990: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
d9a0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
d9b0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  if( pIndex->iDb 
d9c0: 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
d9d0: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
d9e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
d9f0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
da00: 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
da10: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
da20: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
da30: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
da40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
da50: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
da60: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
da70: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
da80: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
da90: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
daa0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
dab0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
dac0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
dad0: 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20  p dropIndex[] = 
dae0: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  {.      { OP_Rew
daf0: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
db00: 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20  (9), 0}, .      
db10: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
db20: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
db30: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
db40: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
db50: 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  1, 1,       0},.
db60: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
db70: 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
db80: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
db90: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
dba0: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
dbb0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
dbc0: 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
dbd0: 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(8), 0},.   
dbe0: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
dbf0: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
dc00: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
dc10: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
dc20: 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20  DR(9), 0},.     
dc30: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
dc40: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
dc50: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
dc60: 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  .    int base;..
dc70: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
dc80: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
dc90: 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d  arse, 0, pIndex-
dca0: 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
dcb0: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
dcc0: 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  (v, pIndex->iDb)
dcd0: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c  ;.    base = sql
dce0: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
dcf0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
dd00: 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e  opIndex), dropIn
dd10: 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
dd20: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
dd30: 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e  base+1, pIndex->
dd40: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
dd50: 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  f( pIndex->iDb==
dd60: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
dd70: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
dd80: 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , v);.    }.    
dd90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dda0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
ddb0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
ddc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
ddd0: 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74  stroy, pIndex->t
dde0: 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
ddf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64  );.    sqliteEnd
de00: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
de10: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
de20: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
de30: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
de40: 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  on of this index
de50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
de60: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
de70: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
de80: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
de90: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  db, pIndex);.   
dea0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
deb0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
dec0: 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  es;.  }..exit_dr
ded0: 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
dee0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
def0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
df00: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
df10: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
df20: 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
df30: 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
df40: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
df50: 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
df60: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
df70: 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
df80: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
df90: 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73  ist *sqliteIdLis
dfa0: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
dfb0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
dfc0: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
dfd0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
dfe0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
dff0: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
e000: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
e010: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
e020: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69  ;.  }.  if( (pLi
e030: 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20  st->nId & 7)==0 
e040: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
e050: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
e060: 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
e070: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70  loc(pList->a, (p
e080: 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a  List->nId+8)*siz
e090: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
e0a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
e0b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e0c0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
e0d0: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
e0e0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
e0f0: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
e100: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
e110: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
e120: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
e130: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
e140: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
e150: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
e160: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
e170: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
e180: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
e190: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
e1a0: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  n->n, 0);.    if
e1b0: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
e1c0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
e1d0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
e1e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e1f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
e200: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
e210: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c  ;.    }.  }.  pL
e220: 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
e230: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
e240: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
e250: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
e260: 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
e270: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
e280: 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
e290: 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
e2a0: 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
e2b0: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
e2c0: 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
e2d0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
e2e0: 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
e2f0: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
e300: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
e310: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
e320: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
e330: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
e340: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
e350: 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
e360: 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
e370: 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
e380: 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
e390: 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
e3a0: 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
e3b0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
e3c0: 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
e3d0: 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
e3e0: 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
e3f0: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
e400: 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
e410: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
e420: 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
e430: 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
e440: 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
e450: 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
e460: 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
e470: 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
e480: 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
e490: 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
e4a0: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
e4b0: 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
e4c0: 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
e4d0: 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
e4e0: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
e4f0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
e500: 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
e510: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
e520: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
e530: 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
e540: 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
e550: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
e560: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
e570: 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
e580: 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
e590: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
e5a0: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
e5b0: 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
e5c0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
e5d0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
e5e0: 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
e5f0: 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
e600: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53 72 63  cList *sqliteSrc
e610: 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69  ListAppend(SrcLi
e620: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
e630: 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20   *pTable, Token 
e640: 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69  *pDatabase){.  i
e650: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
e660: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
e670: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
e680: 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
e690: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
e6a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
e6b0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 20  f( (pList->nSrc 
e6c0: 26 20 37 29 3d 3d 31 20 29 7b 0a 20 20 20 20 53  & 7)==1 ){.    S
e6d0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
e6e0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
e6f0: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20  ealloc(pList,.  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
e710: 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
e720: 4c 69 73 74 2d 3e 6e 53 72 63 2b 38 29 2a 73 69  List->nSrc+8)*si
e730: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
e740: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
e750: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
e760: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
e770: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
e780: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
e790: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
e7a0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e7b0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e7c0: 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSrc], 0, sizeof
e7d0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
e7e0: 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
e7f0: 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
e800: 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
e810: 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
e820: 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
e830: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
e840: 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
e850: 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
e860: 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
e870: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
e880: 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  mp;.  }.  if( pT
e890: 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72  able ){.    char
e8a0: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
e8b0: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
e8c0: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
e8d0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
e8e0: 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65  Table->z, pTable
e8f0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
e900: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
e910: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
e920: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
e930: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
e950: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
e960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
e970: 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
e980: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
e990: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e9a0: 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b  nSrc].zDatabase;
e9b0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
e9c0: 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74 61 62  tring(pz, pDatab
e9d0: 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73  ase->z, pDatabas
e9e0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  e->n, 0);.    if
e9f0: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
ea00: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44    sqliteSrcListD
ea10: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
ea20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ea30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
ea40: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
ea50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
ea60: 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
ea70: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
ea80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c  ./*.** Add an al
ea90: 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ias to the last 
eaa0: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68  identifier on th
eab0: 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
eac0: 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  er list..*/.void
ead0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 64   sqliteSrcListAd
eae0: 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a  dAlias(SrcList *
eaf0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
eb00: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
eb10: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72  st && pList->nSr
eb20: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  c>0 ){.    int i
eb30: 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d   = pList->nSrc -
eb40: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   1;.    sqliteSe
eb50: 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d  tNString(&pList-
eb60: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54  >a[i].zAlias, pT
eb70: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
eb80: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  >n, 0);.    sqli
eb90: 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d  teDequote(pList-
eba0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  >a[i].zAlias);. 
ebb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
ebc0: 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
ebd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69  .void sqliteIdLi
ebe0: 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
ebf0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
ec00: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
ec10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
ec20: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
ec30: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
ec40: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
ec50: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
ec60: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
ec70: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
ec80: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
ec90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
eca0: 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
ecb0: 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
ecc0: 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
ecd0: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
ece0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
ecf0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64   sqliteIdListInd
ed00: 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
ed10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
ed20: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
ed30: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
ed40: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
ed50: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
ed60: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
ed70: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
ed80: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
ed90: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
eda0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
edb0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
edc0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
edd0: 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
ede0: 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
edf0: 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
ee00: 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  oid sqliteSrcLis
ee10: 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
ee20: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
ee30: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
ee40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
ee50: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
ee60: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
ee70: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
ee80: 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[i].zDatabase)
ee90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
eea0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
eeb0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
eec0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
eed0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
eee0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
eef0: 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  b && pList->a[i]
ef00: 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  .pTab->isTransie
ef10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
ef20: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
ef30: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
ef40: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
ef50: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
ef60: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
ef70: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
ef80: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  eExprDelete(pLis
ef90: 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20  t->a[i].pOn);.  
efa0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
efb0: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
efc0: 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  .pUsing);.  }.  
efd0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
efe0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
eff0: 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20  COPY command is 
f000: 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  for compatibilit
f010: 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53 51  y with PostgreSQ
f020: 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69 61  L and specificia
f030: 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61  lly.** for the a
f040: 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74  bility to read t
f050: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f  he output of pg_
f060: 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61  dump.  The forma
f070: 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f  t is as.** follo
f080: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50  ws:.**.**    COP
f090: 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c  Y table FROM fil
f0a0: 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54  e [USING DELIMIT
f0b0: 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a  ERS string].**.*
f0c0: 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20  * "table" is an 
f0d0: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e  existing table n
f0e0: 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65  ame.  We will re
f0f0: 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65  ad lines of code
f100: 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f   from.** file to
f110: 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65   fill this table
f120: 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c   with data.  Fil
f130: 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64 69  e might be "stdi
f140: 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61  n".  The optiona
f150: 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73  l.** delimiter s
f160: 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73  tring identifies
f170: 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61 72   the field separ
f180: 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61  ators.  The defa
f190: 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f  ult is a tab..*/
f1a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79  .void sqliteCopy
f1b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f1c0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
f1d0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
f1e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
f1f0: 62 6c 65 4e 61 6d 65 2c 20 2f 2a 20 54 68 65 20  bleName, /* The 
f200: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
f210: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
f220: 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20  will insert */. 
f230: 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d   Token *pFilenam
f240: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  e,    /* The fil
f250: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
f260: 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  obtain informati
f270: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
f280: 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20  Delimiter,   /* 
f290: 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65 20  Use this as the 
f2a0: 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20  field delimiter 
f2b0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
f2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
f2d0: 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e  t to do if a con
f2e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f  straint fails */
f2f0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
f300: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  b;.  int i;.  Vd
f310: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64  be *v;.  int add
f320: 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20  r, end;.  Index 
f330: 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a  *pIdx;.  char *z
f340: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
f350: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
f360: 3e 64 62 3b 0a 0a 0a 20 20 69 66 28 20 73 71 6c  >db;...  if( sql
f370: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
f380: 64 20 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63  d  ) goto copy_c
f390: 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65 72 74  leanup;.  assert
f3a0: 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53  ( pTableName->nS
f3b0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
f3c0: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 4c  = sqliteSrcListL
f3d0: 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
f3e0: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ableName);.  if(
f3f0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 73 71 6c 69   pTab==0 || sqli
f400: 74 65 49 73 52 65 61 64 4f 6e 6c 79 28 70 50 61  teIsReadOnly(pPa
f410: 72 73 65 2c 20 70 54 61 62 29 20 29 20 67 6f 74  rse, pTab) ) got
f420: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
f430: 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
f440: 53 74 72 4e 44 75 70 28 70 46 69 6c 65 6e 61 6d  StrNDup(pFilenam
f450: 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  e->z, pFilename-
f460: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71  >n);.  sqliteDeq
f470: 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20 20 69  uote(zFile);.  i
f480: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
f490: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
f4a0: 45 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 2d 3e  E_INSERT, pTab->
f4b0: 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 0a 20 20  zName, zFile).  
f4c0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 41 75 74      || sqliteAut
f4d0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f4e0: 51 4c 49 54 45 5f 43 4f 50 59 2c 20 70 54 61 62  QLITE_COPY, pTab
f4f0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 20  ->zName, zFile) 
f500: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79  ){.    goto copy
f510: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
f520: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
f530: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f540: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
f550: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
f560: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 70  ion(pParse, 1, p
f570: 54 61 62 2d 3e 69 44 62 3d 3d 31 29 3b 0a 20 20  Tab->iDb==1);.  
f580: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
f590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
f5a0: 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a  ileOpen, 0, 0);.
f5b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
f5c0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
f5d0: 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46  pFilename->z, pF
f5e0: 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  ilename->n);.   
f5f0: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
f600: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
f610: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f620: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
f630: 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
f640: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f650: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
f660: 72 69 74 65 2c 20 30 2c 20 70 54 61 62 2d 3e 74  rite, 0, pTab->t
f670: 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  num);.    sqlite
f680: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
f690: 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  -1, pTab->zName,
f6a0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
f6b0: 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70   for(i=1, pIdx=p
f6c0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f6d0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f6e0: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
f6f0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
f700: 44 62 3d 3d 31 20 7c 7c 20 70 49 64 78 2d 3e 69  Db==1 || pIdx->i
f710: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
f720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f730: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f740: 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
f750: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f760: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f770: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 2c 20 70  _OpenWrite, i, p
f780: 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Idx->tnum);.    
f790: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
f7a0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78  geP3(v, -1, pIdx
f7b0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
f7c0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  IC);.    }.    i
f7d0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
f7e0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
f7f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
f800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f810: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20  nteger, 0, 0);  
f820: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
f830: 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  e row count */. 
f840: 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73     }.    end = s
f850: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
f860: 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20  el(v);.    addr 
f870: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
f880: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64  p(v, OP_FileRead
f890: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e  , pTab->nCol, en
f8a0: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c  d);.    if( pDel
f8b0: 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  imiter ){.      
f8c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
f8d0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c  P3(v, addr, pDel
f8e0: 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69  imiter->z, pDeli
f8f0: 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20  miter->n);.     
f900: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
f910: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
f920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f930: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
f940: 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22  P3(v, addr, "\t"
f950: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
f960: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
f970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f980: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f990: 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54  P_FileColumn, pT
f9a0: 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20  ab->iPKey, 0);. 
f9b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f9c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
f9d0: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
f9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f9f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fa00: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
fa10: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
fa20: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
fa30: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
fa40: 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69    if( i==pTab->i
fa50: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
fa60: 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 70  /* The integer p
fa70: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
fa80: 6e 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  n is filled with
fa90: 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a   NULL since its.
faa0: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
fab0: 20 69 73 20 61 6c 77 61 79 73 20 70 75 6c 6c 65   is always pulle
fac0: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  d from the recor
fad0: 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  d number */.    
fae0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
faf0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
fb00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
fb10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
fb20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fb30: 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20   OP_FileColumn, 
fb40: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i, 0);.      }. 
fb50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 47     }.    sqliteG
fb60: 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
fb70: 74 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20  tChecks(pParse, 
fb80: 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30  pTab, 0, 0, 0, 0
fb90: 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29  , onError, addr)
fba0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70  ;.    sqliteComp
fbb0: 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50  leteInsertion(pP
fbc0: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
fbd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
fbe0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
fbf0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21  LITE_CountRows)!
fc00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
fc10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fc20: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b  P_AddImm, 1, 0);
fc30: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72    /* Increment r
fc40: 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ow count */.    
fc50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
fc60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
fc70: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  , 0, addr);.    
fc80: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
fc90: 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a  eLabel(v, end);.
fca0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fcb0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
fcc0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
fcd0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
fce0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
fcf0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
fd00: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
fd10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fd20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd30: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30  ColumnName, 0, 0
fd40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
fd50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
fd60: 31 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65  1, "rows inserte
fd70: 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  d", P3_STATIC);.
fd80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
fd90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
fda0: 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20  back, 1, 0);.   
fdb0: 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63   }.  }.  .copy_c
fdc0: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
fdd0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
fde0: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  ableName);.  sql
fdf0: 69 74 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a  iteFree(zFile);.
fe00: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
fe10: 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  ** The non-stand
fe20: 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  ard VACUUM comma
fe30: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c  nd is used to cl
fe40: 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62  ean up the datab
fe50: 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65  ase,.** collapse
fe60: 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63   free space, etc
fe70: 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65  .  It is modelle
fe80: 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55  d after the VACU
fe90: 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e  UM command.** in
fea0: 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a   PostgreSQL..**.
feb0: 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e  ** In version 1.
fec0: 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74  0.x of SQLite, t
fed0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
fee0: 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20  d would call.** 
fef0: 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28  gdbm_reorganize(
ff00: 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74  ) on all the dat
ff10: 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42  abase tables.  B
ff20: 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  ut beginning.** 
ff30: 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69  with 2.0.0, SQLi
ff40: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
ff50: 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63  s GDBM so this c
ff60: 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65  ommand has.** be
ff70: 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  come a no-op..*/
ff80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75  .void sqliteVacu
ff90: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
ffa0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e  , Token *pTableN
ffb0: 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ame){.  /* Do no
ffc0: 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
ffd0: 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
ffe0: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
fff0: 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63  liteBeginTransac
10000 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
10010 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
10020 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
10030 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
10040 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
10050 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
10060 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
10070 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
10080 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
10090 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
100a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
100b0 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
100c0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
100d0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
100e0 47 49 4e 22 2c 20 30 29 20 29 20 72 65 74 75 72  GIN", 0) ) retur
100f0 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  n;.  if( db->fla
10100 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
10110 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ans ){.    sqlit
10120 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10130 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20  , "cannot start 
10140 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  a transaction wi
10150 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
10160 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
10170 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 65  ;.  }.  sqliteBe
10180 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
10190 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  n(pParse, 0, 0);
101a0 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
101b0 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
101c0 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
101d0 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
101e0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
101f0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
10200 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73  qliteCommitTrans
10210 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
10220 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
10230 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  *db;..  if( pPar
10240 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
10250 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
10260 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
10270 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10280 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10290 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
102a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
102b0 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
102c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
102d0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
102e0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 29 20 29  , "COMMIT", 0) )
102f0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
10300 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10310 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
10320 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
10330 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
10340 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f  nnot commit - no
10350 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10360 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65  active");.    re
10370 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  turn;.  }.  db->
10380 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
10390 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69  _InTrans;.  sqli
103a0 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
103b0 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64  ion(pParse);.  d
103c0 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
103d0 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
103e0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
103f0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
10400 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54   sqliteRollbackT
10410 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
10420 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
10430 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
10440 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
10450 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
10460 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
10470 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
10480 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10490 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
104a0 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
104b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
104c0 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
104d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
104e0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
104f0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 29 20   "ROLLBACK", 0) 
10500 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10510 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
10520 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
10530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
10540 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
10550 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d  annot rollback -
10560 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
10570 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20  is active");.   
10580 20 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20   return; .  }.  
10590 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
105a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
105b0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
105c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
105d0 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b  Rollback, 0, 0);
105e0 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
105f0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
10600 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72  ans;.  db->onErr
10610 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b  or = OE_Default;
10620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
10630 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
10640 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
10650 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
10660 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64  for all.** named
10670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
10680 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
10690 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
106a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
106b0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
106c0 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
106d0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
106e0 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
106f0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
10700 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
10710 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 31 20  ){.    if( i==1 
10720 7c 7c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  || db->aDb[i].pB
10730 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
10740 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10750 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
10760 79 43 6f 6f 6b 69 65 2c 20 69 2c 20 64 62 2d 3e  yCookie, i, db->
10770 61 44 62 5b 69 5d 2e 73 63 68 65 6d 61 5f 63 6f  aDb[i].schema_co
10780 6f 6b 69 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  okie);.  }.  pPa
10790 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
107a0 69 65 64 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ied = 1;.}../*.*
107b0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
107c0 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
107d0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
107e0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
107f0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
10800 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
10810 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10820 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
10830 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
10840 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
10850 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
10860 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
10870 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
10880 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
10890 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
108a0 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
108b0 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  the setCheckpoin
108c0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
108d0 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
108e0 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
108f0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
10900 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
10910 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
10920 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
10930 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
10940 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
10950 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
10960 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
10970 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
10980 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
10990 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
109a0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
109b0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
109c0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
109d0 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
109e0 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
109f0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
10a00 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
10a10 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
10a20 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
10a30 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
10a40 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
10a50 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  set..**.** The t
10a60 65 6d 70 4f 6e 6c 79 20 66 6c 61 67 20 69 6e 64  empOnly flag ind
10a70 69 63 61 74 65 73 20 74 68 61 74 20 6f 6e 6c 79  icates that only
10a80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10a90 73 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  s will be change
10aa0 64 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 69 73  d.** during this
10ab0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
10ac0 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79 20 64  .  The primary d
10ad0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
10ae0 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f   not.** write-lo
10af0 63 6b 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 20  cked.  Only the 
10b00 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
10b10 73 65 20 66 69 6c 65 20 67 65 74 73 20 61 20 77  se file gets a w
10b20 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74  rite lock..** Ot
10b30 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
10b40 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  n continue to re
10b50 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
10b60 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
10b70 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
10b80 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
10b90 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
10ba0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43  pParse, int setC
10bb0 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 74  heckpoint, int t
10bc0 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56 64 62 65  empOnly){.  Vdbe
10bd0 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
10be0 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
10bf0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10c00 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
10c10 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
10c20 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74   return; /* if t
10c30 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67  his is in a trig
10c40 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ger */.  if( (pP
10c50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
10c60 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
10c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
10c80 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10c90 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31  P_Transaction, 1
10ca0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 74  , 0);.    if( !t
10cb0 65 6d 70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  empOnly ){.     
10cc0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10cd0 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
10ce0 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  on, 0, 0);.     
10cf0 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66   sqliteCodeVerif
10d00 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 3b  ySchema(pParse);
10d10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
10d20 66 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74  f( setCheckpoint
10d30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
10d40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68  beAddOp(v, OP_Ch
10d50 65 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b  eckpoint, 0, 0);
10d60 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10d70 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
10d80 70 6f 69 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20  point, 1, 0);.  
10d90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
10da0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f  ate code that co
10db0 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61  ncludes an opera
10dc0 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61  tion that may ha
10dd0 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68  ve changed.** th
10de0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
10df0 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e  s is a companion
10e00 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67   function to Beg
10e10 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10e20 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  ()..** If a tran
10e30 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
10e40 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ted, then commit
10e50 20 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b   it.  If a check
10e60 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61  point was.** sta
10e70 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74  rted then commit
10e80 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   that..*/.void s
10e90 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
10ea0 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
10eb0 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
10ec0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10ed0 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75  trigStack ) retu
10ee0 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69  rn; /* if this i
10ef0 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a  s in a trigger *
10f00 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
10f10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10f20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
10f30 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
10f40 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
10f50 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a  LITE_InTrans ){.
10f60 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e      /* Do Nothin
10f70 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  g */.  }else{.  
10f80 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10f90 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
10fa0 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  0, 0);.  }.}.../
10fb0 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
10fc0 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
10fd0 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  as a boolean val
10fe0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
10ff0 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61  t getBoolean(cha
11000 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20  r *z){.  static 
11010 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d  char *azTrue[] =
11020 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20   { "yes", "on", 
11030 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20  "true" };.  int 
11040 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30  i;.  if( z[0]==0
11050 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11060 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29  f( isdigit(z[0])
11070 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26   || (z[0]=='-' &
11080 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29  & isdigit(z[1]))
11090 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
110a0 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f  toi(z);.  }.  fo
110b0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
110c0 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61  azTrue)/sizeof(a
110d0 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zTrue[0]); i++){
110e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
110f0 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b  trICmp(z,azTrue[
11100 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
11110 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
11120 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
11130 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
11140 73 74 72 69 6e 67 20 61 73 20 61 20 73 61 66 65  string as a safe
11150 74 79 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72  ty level.  Retur
11160 6e 20 30 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20  n 0 for OFF,.** 
11170 31 20 66 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d  1 for ON or NORM
11180 41 4c 20 61 6e 64 20 32 20 66 6f 72 20 46 55 4c  AL and 2 for FUL
11190 4c 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  L..**.** Note th
111a0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
111b0 74 75 72 6e 65 64 20 61 72 65 20 6f 6e 65 20 6c  turned are one l
111c0 65 73 73 20 74 68 61 74 20 74 68 65 20 76 61 6c  ess that the val
111d0 75 65 73 20 74 68 61 74 0a 2a 2a 20 73 68 6f 75  ues that.** shou
111e0 6c 64 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ld be passed int
111f0 6f 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74  o sqliteBtreeSet
11200 53 61 66 65 74 79 4c 65 76 65 6c 28 29 2e 20 20  SafetyLevel().  
11210 54 68 65 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 74  The is done.** t
11220 6f 20 73 75 70 70 6f 72 74 20 6c 65 67 61 63 79  o support legacy
11230 20 53 51 4c 20 63 6f 64 65 2e 20 20 54 68 65 20   SQL code.  The 
11240 73 61 66 65 74 79 20 6c 65 76 65 6c 20 75 73 65  safety level use
11250 64 20 74 6f 20 62 65 20 62 6f 6f 6c 65 61 6e 0a  d to be boolean.
11260 2a 2a 20 61 6e 64 20 6f 6c 64 65 72 20 73 63 72  ** and older scr
11270 69 70 74 73 20 6d 61 79 20 68 61 76 65 20 75 73  ipts may have us
11280 65 64 20 6e 75 6d 62 65 72 73 20 30 20 66 6f 72  ed numbers 0 for
11290 20 4f 46 46 20 61 6e 64 20 31 20 66 6f 72 20 4f   OFF and 1 for O
112a0 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
112b0 20 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28   getSafetyLevel(
112c0 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74  char *z){.  stat
112d0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
112e0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
112f0 20 2a 7a 57 6f 72 64 3b 0a 20 20 20 20 69 6e 74   *zWord;.    int
11300 20 76 61 6c 3b 0a 20 20 7d 20 61 4b 65 79 5b 5d   val;.  } aKey[]
11310 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 6f 22 2c   = {.    { "no",
11320 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
11330 6f 66 66 22 2c 20 20 20 30 20 7d 2c 0a 20 20 20  off",   0 },.   
11340 20 7b 20 22 66 61 6c 73 65 22 2c 20 30 20 7d 2c   { "false", 0 },
11350 0a 20 20 20 20 7b 20 22 79 65 73 22 2c 20 20 20  .    { "yes",   
11360 31 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6e 22 2c  1 },.    { "on",
11370 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22      1 },.    { "
11380 74 72 75 65 22 2c 20 20 31 20 7d 2c 0a 20 20 20  true",  1 },.   
11390 20 7b 20 22 66 75 6c 6c 22 2c 20 20 32 20 7d 2c   { "full",  2 },
113a0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
113b0 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72   if( z[0]==0 ) r
113c0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
113d0 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20  sdigit(z[0]) || 
113e0 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73  (z[0]=='-' && is
113f0 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a  digit(z[1])) ){.
11400 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28      return atoi(
11410 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  z);.  }.  for(i=
11420 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4b 65 79  0; i<sizeof(aKey
11430 29 2f 73 69 7a 65 6f 66 28 61 4b 65 79 5b 30 5d  )/sizeof(aKey[0]
11440 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11450 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11460 2c 61 4b 65 79 5b 69 5d 2e 7a 57 6f 72 64 29 3d  ,aKey[i].zWord)=
11470 3d 30 20 29 20 72 65 74 75 72 6e 20 61 4b 65 79  =0 ) return aKey
11480 5b 69 5d 2e 76 61 6c 3b 0a 20 20 7d 0a 20 20 72  [i].val;.  }.  r
11490 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
114a0 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67  * Process a prag
114b0 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  ma statement.  .
114c0 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72  **.** Pragmas ar
114d0 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a  e of this form:.
114e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d  **.**      PRAGM
114f0 41 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a  A id = value.**.
11500 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69 65  ** The identifie
11510 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  r might also be 
11520 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76  a string.  The v
11530 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
11540 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66  , and.** identif
11550 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72  ier, or a number
11560 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20  .  If minusFlag 
11570 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
11580 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20  e value is.** a 
11590 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73 20  number that was 
115a0 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
115b0 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69  nus sign..*/.voi
115c0 64 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28 50  d sqlitePragma(P
115d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
115e0 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65  ken *pLeft, Toke
115f0 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6d  n *pRight, int m
11600 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68 61  inusFlag){.  cha
11610 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r *zLeft = 0;.  
11620 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30  char *zRight = 0
11630 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
11640 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
11650 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
11660 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11670 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
11680 75 72 6e 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20  urn;..  zLeft = 
11690 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
116a0 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e  eft->z, pLeft->n
116b0 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
116c0 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28  te(zLeft);.  if(
116d0 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
116e0 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20    zRight = 0;.  
116f0 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
11700 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c  ng(&zRight, "-",
11710 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70   1, pRight->z, p
11720 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Right->n, 0);.  
11730 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
11740 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
11750 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69  p(pRight->z, pRi
11760 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ght->n);.    sql
11770 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68  iteDequote(zRigh
11780 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  t);.  }.  if( sq
11790 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
117a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
117b0 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
117c0 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ht) ){.    sqlit
117d0 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20  eFree(zLeft);.  
117e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69    sqliteFree(zRi
117f0 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
11800 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a  ;.  }. .  /*.  *
11810 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c  *  PRAGMA defaul
11820 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
11830 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c  *  PRAGMA defaul
11840 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20  t_cache_size=N. 
11850 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
11860 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
11870 74 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73  the current pers
11880 69 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66  istent setting f
11890 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  or the.  ** page
118a0 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68   cache size.  Th
118b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
118c0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
118d0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70  number of.  ** p
118e0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
118f0 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63   cache.  The sec
11900 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f  ond form sets bo
11910 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  th the current. 
11920 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
11930 69 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ize value and th
11940 65 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67  e persistent pag
11950 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
11960 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  ue.  ** stored i
11970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11980 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ile..  **.  ** T
11990 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
119a0 20 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20   size is stored 
119b0 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20  in meta-value 2 
119c0 6f 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  of page 1 of the
119d0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
119e0 69 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65 20  ile.  The cache 
119f0 73 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79  size is actually
11a00 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   the absolute va
11a10 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  lue of.  ** this
11a20 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
11a30 2e 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d  .  The sign of m
11a40 65 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65  eta-value 2 dete
11a50 72 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20  rmines the.  ** 
11a60 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74  synchronous sett
11a70 69 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65  ing.  A negative
11a80 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e   value means syn
11a90 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a  chronous is off.
11aa0 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74    ** and a posit
11ab0 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20  ive value means 
11ac0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
11ad0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  n..  */.  if( sq
11ae0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
11af0 74 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65  t,"default_cache
11b00 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
11b10 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
11b20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d  getCacheSize[] =
11b30 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
11b40 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c  adCookie,  0, 2,
11b50 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
11b60 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c    { OP_AbsValue,
11b70 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
11b80 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11b90 44 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20  Dup,         0, 
11ba0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11bb0 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
11bc0 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
11bd0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
11be0 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30  P_Ne,          0
11bf0 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 6,        0},.
11c00 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
11c10 65 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45  er,     MAX_PAGE
11c20 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  S,0, 0},.      {
11c30 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
11c40 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
11c50 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
11c60 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
11c70 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
11c80 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
11c90 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d   if( pRight->z==
11ca0 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
11cb0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11cc0 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
11cd0 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
11ce0 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b  , getCacheSize);
11cf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11d00 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11d10 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f    int size = ato
11d20 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
11d30 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
11d40 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
11d50 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
11d60 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
11d70 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
11d80 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11d90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11da0 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  size, 0);.      
11db0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11dc0 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
11dd0 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 61  , 0, 2);.      a
11de0 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
11df0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
11e00 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
11e10 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11e20 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61  p(v, OP_Ge, 0, a
11e30 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
11e40 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11e50 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
11e60 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11e70 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11e80 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32  _SetCookie, 0, 2
11e90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
11ea0 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
11eb0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11ec0 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  db->cache_size =
11ed0 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c   db->cache_size<
11ee0 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65  0 ? -size : size
11ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
11f00 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
11f10 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
11f20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  db->cache_size);
11f30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
11f40 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
11f50 41 20 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  A cache_size.  *
11f60 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  *  PRAGMA cache_
11f70 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
11f80 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
11f90 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
11fa0 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  ent local settin
11fb0 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
11fc0 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
11fd0 20 54 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69   The local setti
11fe0 6e 67 20 63 61 6e 20 62 65 20 64 69 66 66 65 72  ng can be differ
11ff0 65 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ent from.  ** th
12000 65 20 70 65 72 73 69 73 74 65 6e 74 20 63 61 63  e persistent cac
12010 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 74 68  he size value th
12020 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  at is stored in 
12030 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
12040 2a 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 20  * file itself.  
12050 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
12060 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ed is the maximu
12070 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  m number of.  **
12080 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
12090 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73  ge cache.  The s
120a0 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20  econd form sets 
120b0 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70  the local.  ** p
120c0 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76  age cache size v
120d0 61 6c 75 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  alue.  It does n
120e0 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 65  ot change the pe
120f0 72 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61  rsistent.  ** ca
12100 63 68 65 20 73 69 7a 65 20 73 74 6f 72 65 64 20  che size stored 
12110 6f 6e 20 74 68 65 20 64 69 73 6b 20 73 6f 20 74  on the disk so t
12120 68 65 20 63 61 63 68 65 20 73 69 7a 65 20 77 69  he cache size wi
12130 6c 6c 20 72 65 76 65 72 74 0a 20 20 2a 2a 20 74  ll revert.  ** t
12140 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61  o its default va
12150 6c 75 65 20 77 68 65 6e 20 74 68 65 20 64 61 74  lue when the dat
12160 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 20  abase is closed 
12170 61 6e 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20  and reopened..  
12180 2a 2a 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 61  ** N should be a
12190 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
121a0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  r..  */.  if( sq
121b0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
121c0 74 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d  t,"cache_size")=
121d0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
121e0 20 56 64 62 65 4f 70 20 67 65 74 43 61 63 68 65   VdbeOp getCache
121f0 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Size[] = {.     
12200 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
12210 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
12220 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20  "cache_size"},. 
12230 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61       { OP_Callba
12240 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ck,    1, 0,    
12250 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
12260 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
12270 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
12280 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
12290 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a  b->cache_size;;.
122a0 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
122b0 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
122c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
122d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
122e0 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
122f0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12300 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
12310 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
12320 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
12330 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
12340 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
12350 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
12360 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
12370 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
12380 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61        if( db->ca
12390 63 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a  che_size<0 ) siz
123a0 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
123b0 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
123c0 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
123d0 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
123e0 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d  eSize(db->aDb[0]
123f0 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f  .pBt, db->cache_
12400 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  size);.    }.  }
12410 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
12420 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f   PRAGMA default_
12430 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a  synchronous.  **
12440 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
12450 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 4e 7c  _synchronous=ON|
12460 4f 46 46 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a  OFF|NORMAL|FULL.
12470 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
12480 72 73 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73  rst form returns
12490 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
124a0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79  value of the "sy
124b0 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69  nchronous" setti
124c0 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  ng.  ** that is 
124d0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
124e0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
124f0 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73   the synchronous
12500 20 73 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20   setting that.  
12510 2a 2a 20 69 73 20 75 73 65 64 20 77 68 65 6e 65  ** is used whene
12520 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
12530 20 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73   is opened unles
12540 73 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  s overridden by 
12550 61 20 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20  a separate.  ** 
12560 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72  "synchronous" pr
12570 61 67 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e  agma.  The secon
12580 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74  d form changes t
12590 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e  he persistent an
125a0 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c  d the.  ** local
125b0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
125c0 74 69 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75  ting to the valu
125d0 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20  e given..  **.  
125e0 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75  ** If synchronou
125f0 73 20 69 73 20 4f 46 46 2c 20 53 51 4c 69 74 65  s is OFF, SQLite
12600 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
12610 74 20 61 6e 79 20 66 73 79 6e 63 28 29 20 73 79  t any fsync() sy
12620 73 74 65 6d 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  stems calls.  **
12630 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 64 61   to make sure da
12640 74 61 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ta is committed 
12650 74 6f 20 64 69 73 6b 2e 20 20 57 72 69 74 65 20  to disk.  Write 
12660 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 76  operations are v
12670 65 72 79 20 66 61 73 74 2c 0a 20 20 2a 2a 20 62  ery fast,.  ** b
12680 75 74 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ut a power failu
12690 72 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65  re can leave the
126a0 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20   database in an 
126b0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
126c0 74 65 2e 0a 20 20 2a 2a 20 49 66 20 73 79 6e 63  te..  ** If sync
126d0 68 72 6f 6e 6f 75 73 20 69 73 20 4f 4e 20 6f 72  hronous is ON or
126e0 20 4e 4f 52 4d 41 4c 2c 20 53 51 4c 69 74 65 20   NORMAL, SQLite 
126f0 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63  will do an fsync
12700 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
12710 6f 0a 20 20 2a 2a 20 6d 61 6b 65 20 73 75 72 65  o.  ** make sure
12720 20 64 61 74 61 20 69 73 20 62 65 69 6e 67 20 77   data is being w
12730 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
12740 20 54 68 65 20 72 69 73 6b 20 6f 66 20 63 6f 72   The risk of cor
12750 72 75 70 74 69 6f 6e 20 64 75 65 20 74 6f 0a 20  ruption due to. 
12760 20 2a 2a 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   ** a power loss
12770 20 69 6e 20 74 68 69 73 20 6d 6f 64 65 20 69 73   in this mode is
12780 20 6e 65 67 6c 69 67 69 62 6c 65 20 62 75 74 20   negligible but 
12790 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 73 79  non-zero.  If sy
127a0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69  nchronous.  ** i
127b0 73 20 46 55 4c 4c 2c 20 65 78 74 72 61 20 66 73  s FULL, extra fs
127c0 79 6e 63 28 29 73 20 6f 63 63 75 72 20 74 6f 20  ync()s occur to 
127d0 72 65 64 75 63 65 20 74 68 65 20 72 69 73 6b 20  reduce the risk 
127e0 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 74 6f  of corruption to
127f0 20 6e 65 61 72 0a 20 20 2a 2a 20 7a 65 72 6f 2c   near.  ** zero,
12800 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
12810 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 65  e performance pe
12820 6e 61 6c 74 79 2e 20 20 54 68 65 20 64 65 66 61  nalty.  The defa
12830 75 6c 74 20 6d 6f 64 65 20 69 73 20 4e 4f 52 4d  ult mode is NORM
12840 41 4c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  AL..  */.  if( s
12850 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
12860 66 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63  ft,"default_sync
12870 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a  hronous")==0 ){.
12880 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
12890 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a  p getSync[] = {.
128a0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
128b0 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
128c0 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75       "synchronou
128d0 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  s"},.      { OP_
128e0 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  ReadCookie,  0, 
128f0 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  3,        0},.  
12900 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20      { OP_Dup,   
12910 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
12920 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
12930 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20 30  P_If,          0
12940 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
12950 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
12960 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
12970 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
12980 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
12990 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20  eger,     0, 0, 
129a0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
129b0 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20   { OP_Lt,       
129c0 20 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20     0, 5,        
129d0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41  0},.      { OP_A
129e0 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30  ddImm,      1, 0
129f0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
12a00 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
12a10 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
12a20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
12a30 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 30 2c  _Halt,        0,
12a40 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
12a50 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
12a60 2c 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 20  ,     -1, 0,    
12a70 20 20 20 20 30 7d 2c 20 20 2f 2a 20 31 30 20 2a      0},  /* 10 *
12a80 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  /.      { OP_Cal
12a90 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
12aa0 20 20 20 20 20 20 20 30 7d 0a 20 20 20 20 7d 3b         0}.    };
12ab0 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
12ac0 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
12ad0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
12ae0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12af0 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
12b00 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53  e(getSync), getS
12b10 79 6e 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ync);.      sqli
12b20 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  teVdbeChangeP2(v
12b30 2c 20 61 64 64 72 2b 33 2c 20 61 64 64 72 2b 31  , addr+3, addr+1
12b40 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
12b50 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
12b60 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
12b70 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a  db->cache_size;.
12b80 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
12b90 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
12ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
12bb0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
12bc0 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
12bd0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12be0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
12bf0 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
12c00 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12c10 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
12c20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 0);.      add
12c30 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
12c40 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
12c50 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
12c60 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12c70 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 61 64 64  v, OP_Ne, 0, add
12c80 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
12c90 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12ca0 50 5f 41 64 64 49 6d 6d 2c 20 4d 41 58 5f 50 41  P_AddImm, MAX_PA
12cb0 47 45 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  GES, 0);.      s
12cc0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12cd0 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 30  , OP_AbsValue, 0
12ce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
12cf0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67  safety_level = g
12d00 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52  etSafetyLevel(zR
12d10 69 67 68 74 29 2b 31 3b 0a 20 20 20 20 20 20 69  ight)+1;.      i
12d20 66 28 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65  f( db->safety_le
12d30 76 65 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  vel==1 ){.      
12d40 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12d50 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65  p(v, OP_Negative
12d60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
12d70 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
12d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12d90 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12da0 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
12db0 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
12dc0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12dd0 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73 61  _Integer, db->sa
12de0 66 65 74 79 5f 6c 65 76 65 6c 2c 20 30 29 3b 0a  fety_level, 0);.
12df0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12e00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
12e10 6f 6f 6b 69 65 2c 20 30 2c 20 33 29 3b 0a 20 20  ookie, 0, 3);.  
12e20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
12e30 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
12e40 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  se);.      db->c
12e50 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
12e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
12e70 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
12e80 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
12e90 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  db->cache_size);
12ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
12eb0 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
12ec0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
12ed0 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65   db->safety_leve
12ee0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l);.    }.  }els
12ef0 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  e..  /*.  **   P
12f00 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
12f10 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
12f20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c  synchronous=OFF|
12f30 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20  ON|NORMAL|FULL. 
12f40 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
12f50 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
12f60 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
12f70 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
12f80 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
12f90 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
12fa0 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
12fb0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
12fc0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
12fd0 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
12fe0 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
12ff0 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
13000 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
13010 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
13020 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
13030 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e  rICmp(zLeft,"syn
13040 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b  chronous")==0 ){
13050 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
13060 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b  Op getSync[] = {
13070 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
13080 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
13090 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f        "synchrono
130a0 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  us"},.      { OP
130b0 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
130c0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
130d0 20 20 20 7d 3b 0a 20 20 20 20 69 66 28 20 70 52     };.    if( pR
130e0 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e  ight->z==pLeft->
130f0 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
13100 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13110 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73 61  _Integer, db->sa
13120 66 65 74 79 5f 6c 65 76 65 6c 2d 31 2c 20 30 29  fety_level-1, 0)
13130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
13140 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
13150 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63  rraySize(getSync
13160 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20  ), getSync);.   
13170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
13180 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63  t size = db->cac
13190 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  he_size;.      i
131a0 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
131b0 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
131c0 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  db->safety_level
131d0 20 3d 20 67 65 74 53 61 66 65 74 79 4c 65 76 65   = getSafetyLeve
131e0 6c 28 7a 52 69 67 68 74 29 2b 31 3b 0a 20 20 20  l(zRight)+1;.   
131f0 20 20 20 69 66 28 20 64 62 2d 3e 73 61 66 65 74     if( db->safet
13200 79 5f 6c 65 76 65 6c 3d 3d 31 20 29 20 73 69 7a  y_level==1 ) siz
13210 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
13220 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
13230 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
13240 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
13250 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d  eSize(db->aDb[0]
13260 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f  .pBt, db->cache_
13270 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  size);.      sql
13280 69 74 65 42 74 72 65 65 53 65 74 53 61 66 65 74  iteBtreeSetSafet
13290 79 4c 65 76 65 6c 28 64 62 2d 3e 61 44 62 5b 30  yLevel(db->aDb[0
132a0 5d 2e 70 42 74 2c 20 64 62 2d 3e 73 61 66 65 74  ].pBt, db->safet
132b0 79 5f 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  y_level);.    }.
132c0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
132d0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
132e0 66 74 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65  ft, "trigger_ove
132f0 72 68 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20  rhead_test")==0 
13300 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
13310 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
13320 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f  .      always_co
13330 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70  de_trigger_setup
13340 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
13350 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f  .      always_co
13360 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70  de_trigger_setup
13370 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
13380 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
13390 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
133a0 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30  "vdbe_trace")==0
133b0 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
133c0 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
133d0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
133e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65  s |= SQLITE_Vdbe
133f0 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Trace;.    }else
13400 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
13410 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62  s &= ~SQLITE_Vdb
13420 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20  eTrace;.    }.  
13430 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
13440 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
13450 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  , "full_column_n
13460 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ames")==0 ){.   
13470 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
13480 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
13490 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
134a0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
134b0 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
134c0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
134d0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
134e0 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  Names;.    }.  }
134f0 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
13500 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
13510 20 22 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73   "show_datatypes
13520 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
13530 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
13540 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
13550 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
13560 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20  _ReportTypes;.  
13570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
13580 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
13590 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b  ITE_ReportTypes;
135a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
135b0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
135c0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75  Cmp(zLeft, "resu
135d0 6c 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29  lt_set_details")
135e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
135f0 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
13600 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
13610 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52  lags |= SQLITE_R
13620 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20  esultDetails;.  
13630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
13640 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
13650 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c  ITE_ResultDetail
13660 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
13670 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
13680 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f  rICmp(zLeft, "co
13690 75 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30  unt_changes")==0
136a0 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
136b0 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
136c0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
136d0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e  s |= SQLITE_Coun
136e0 74 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  tRows;.    }else
136f0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
13700 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75  s &= ~SQLITE_Cou
13710 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20  ntRows;.    }.  
13720 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
13730 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
13740 2c 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f  , "empty_result_
13750 63 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29  callbacks")==0 )
13760 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
13770 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
13780 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
13790 7c 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61  |= SQLITE_NullCa
137a0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  llback;.    }els
137b0 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
137c0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75  gs &= ~SQLITE_Nu
137d0 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  llCallback;.    
137e0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
137f0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
13800 4c 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66  Left, "table_inf
13810 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  o")==0 ){.    Ta
13820 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
13830 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
13840 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
13850 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
13860 61 62 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  ab ){.      stat
13870 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49  ic VdbeOp tableI
13880 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b  nfoPreface[] = {
13890 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
138a0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
138b0 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20         "cid"},. 
138c0 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
138d0 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20  mnName,  1, 0,  
138e0 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20       "name"},.  
138f0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13900 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20  nName,  2, 0,   
13910 20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20      "type"},.   
13920 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
13930 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20  Name,  3, 0,    
13940 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20     "notnull"},. 
13950 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
13960 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20  mnName,  4, 0,  
13970 20 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65       "dflt_value
13980 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  "},.      };.   
13990 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
139a0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
139b0 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
139c0 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63  (tableInfoPrefac
139d0 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  e), tableInfoPre
139e0 66 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  face);.      sql
139f0 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
13a00 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
13a10 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ab);.      for(i
13a20 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
13a30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13a40 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13a50 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
13a60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13a70 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13a80 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
13a90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13aa0 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
13ab0 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   -1, pTab->aCol[
13ac0 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  i].zName, P3_STA
13ad0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
13ae0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13af0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
13b00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13b10 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
13b20 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
13b30 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
13b40 54 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f  Type ? pTab->aCo
13b50 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 6e 75  l[i].zType : "nu
13b60 6d 65 72 69 63 22 2c 20 50 33 5f 53 54 41 54 49  meric", P3_STATI
13b70 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
13b80 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13b90 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
13ba0 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
13bb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13bc0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13bd0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
13be0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13bf0 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
13c00 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   -1, pTab->aCol[
13c10 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41  i].zDflt, P3_STA
13c20 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
13c30 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13c40 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c   OP_Callback, 5,
13c50 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13c60 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
13c70 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
13c80 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e  zLeft, "index_in
13c90 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  fo")==0 ){.    I
13ca0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
13cb0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
13cc0 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69   pIdx = sqliteFi
13cd0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69 67  ndIndex(db, zRig
13ce0 68 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ht, 0);.    if( 
13cf0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 74  pIdx ){.      st
13d00 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
13d10 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
13d20 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
13d30 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
13d40 30 2c 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22  0,       "seqno"
13d50 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
13d60 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20  ColumnName,  1, 
13d70 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c  0,       "cid"},
13d80 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
13d90 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c  lumnName,  2, 0,
13da0 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
13db0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
13dc0 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62  nt i;.      pTab
13dd0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
13de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
13df0 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
13e00 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66  raySize(tableInf
13e10 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65  oPreface), table
13e20 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20  InfoPreface);.  
13e30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13e40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
13e50 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
13e60 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43  cnum = pIdx->aiC
13e70 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
13e80 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
13e90 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
13ea0 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
13eb0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13ec0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63  v, OP_Integer, c
13ed0 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  num, 0);.       
13ee0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13ef0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
13f00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
13f10 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
13f20 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  >cnum );.       
13f30 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
13f40 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
13f50 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d  >aCol[cnum].zNam
13f60 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
13f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
13f80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
13f90 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
13fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
13fb0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
13fc0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
13fd0 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30  "index_list")==0
13fe0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
13ff0 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
14000 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d  pTab;.    pTab =
14010 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
14020 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b  (db, zRight, 0);
14030 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
14040 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
14050 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
14060 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  ;.      pIdx = p
14070 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
14080 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 20   }.    if( pTab 
14090 26 26 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  && pIdx ){.     
140a0 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
140b0 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
140c0 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63   indexListPrefac
140d0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
140e0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
140f0 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73    0, 0,       "s
14100 65 71 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  eq"},.        { 
14110 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
14120 31 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d  1, 0,       "nam
14130 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  e"},.        { O
14140 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
14150 2c 20 30 2c 20 20 20 20 20 20 20 22 75 6e 69 71  , 0,       "uniq
14160 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a  ue"},.      };..
14170 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
14180 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
14190 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74  aySize(indexList
141a0 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c  Preface), indexL
141b0 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20  istPreface);.   
141c0 20 20 20 77 68 69 6c 65 28 70 49 64 78 29 7b 0a     while(pIdx){.
141d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
141e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
141f0 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
14200 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
14210 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
14220 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
14230 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
14240 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
14250 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
14260 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
14270 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
14280 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
14290 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
142a0 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  one, 0);.       
142b0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
142c0 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
142d0 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   3, 0);.        
142e0 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ++i;.        pId
142f0 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b  x = pIdx->pNext;
14300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14310 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
14320 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
14330 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
14340 2c 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22  , "parser_trace"
14350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65  )==0 ){.    exte
14360 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61  rn void sqlitePa
14370 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c  rserTrace(FILE*,
14380 20 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66   char *);.    if
14390 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
143a0 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ght) ){.      sq
143b0 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
143c0 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a  stdout, "parser:
143d0 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
143e0 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73        sqlitePars
143f0 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20  erTrace(0, 0);. 
14400 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
14410 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
14420 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
14430 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  "integrity_check
14440 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
14450 74 69 63 20 56 64 62 65 4f 70 20 63 68 65 63 6b  tic VdbeOp check
14460 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  Db[] = {.      {
14470 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
14480 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 32   0, 0,        "2
14490 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  "},.      { OP_I
144a0 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30  nteger,     0, 0
144b0 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 0a  ,        0},   .
144c0 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 52        { OP_OpenR
144d0 65 61 64 2c 20 20 20 20 30 2c 20 32 2c 20 20 20  ead,    0, 2,   
144e0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
144f0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
14500 20 30 2c 20 37 2c 20 20 20 20 20 20 20 20 30 7d   0, 7,        0}
14510 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
14520 75 6d 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20  umn,      0, 3, 
14530 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
14540 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   4 */.      { OP
14550 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c  _SetInsert,   0,
14560 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
14570 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
14580 20 20 20 20 20 20 20 30 2c 20 34 2c 20 20 20 20         0, 4,    
14590 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
145a0 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20  OP_IntegrityCk, 
145b0 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
145c0 20 20 20 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20      /* 7 */.    
145d0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
145e0 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
145f0 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63   "integrity_chec
14600 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  k"},.      { OP_
14610 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
14620 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
14630 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65      { OP_SetInse
14640 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20 20 20  rt,   1, 0,     
14650 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b     "2"},.      {
14660 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
14670 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
14680 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  ,.      { OP_Ope
14690 6e 52 65 61 64 2c 20 20 20 20 31 2c 20 32 2c 20  nRead,    1, 2, 
146a0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
146b0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
146c0 20 20 20 31 2c 20 31 37 2c 20 20 20 20 20 20 20     1, 17,       
146d0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
146e0 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 31 2c 20 33  olumn,      1, 3
146f0 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
14700 2f 2a 20 31 34 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 14 */.      {
14710 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
14720 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
14730 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
14740 74 2c 20 20 20 20 20 20 20 20 31 2c 20 31 34 2c  t,        1, 14,
14750 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
14760 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43   { OP_IntegrityC
14770 6b 2c 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20  k, 1, 1,        
14780 30 7d 2c 20 20 20 20 2f 2a 20 31 37 20 2a 2f 0a  0},    /* 17 */.
14790 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
147a0 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
147b0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
147c0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
147d0 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
147e0 53 69 7a 65 28 63 68 65 63 6b 44 62 29 2c 20 63  Size(checkDb), c
147f0 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65  heckDb);.  }else
14800 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46  ..  {}.  sqliteF
14810 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71  ree(zLeft);.  sq
14820 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29  liteFree(zRight)
14830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14840 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
14850 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
14860 74 6f 20 70 72 6f 63 65 73 73 20 61 6e 20 41 54  to process an AT
14870 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 3a 0a  TACH statement:.
14880 2a 2a 0a 2a 2a 20 20 20 20 20 41 54 54 41 43 48  **.**     ATTACH
14890 20 44 41 54 41 42 41 53 45 20 66 69 6c 65 6e 61   DATABASE filena
148a0 6d 65 20 41 53 20 64 62 6e 61 6d 65 0a 2a 2a 0a  me AS dbname.**.
148b0 2a 2a 20 54 68 65 20 70 46 69 6c 65 6e 61 6d 65  ** The pFilename
148c0 20 61 6e 64 20 70 44 62 6e 61 6d 65 20 61 72 67   and pDbname arg
148d0 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 74  uments are the t
148e0 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 66 69 6e  okens that defin
148f0 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d  e the.** filenam
14900 65 20 61 6e 64 20 64 62 6e 61 6d 65 20 69 6e 20  e and dbname in 
14910 74 68 65 20 41 54 54 41 43 48 20 73 74 61 74 65  the ATTACH state
14920 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
14930 6c 69 74 65 41 74 74 61 63 68 28 50 61 72 73 65  liteAttach(Parse
14940 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
14950 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 54 6f 6b 65  *pFilename, Toke
14960 6e 20 2a 70 44 62 6e 61 6d 65 29 7b 0a 20 20 44  n *pDbname){.  D
14970 62 20 2a 61 4e 65 77 3b 0a 20 20 69 6e 74 20 72  b *aNew;.  int r
14980 63 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 46  c, i;.  char *zF
14990 69 6c 65 2c 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  ile, *zName;.  s
149a0 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
149b0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
149c0 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  n ) return;.  db
149d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
149e0 20 69 66 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62   if( db->aDb==db
149f0 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
14a00 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
14a10 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 64  Malloc( sizeof(d
14a20 62 2d 3e 61 44 62 5b 30 5d 29 2a 33 20 29 3b 0a  b->aDb[0])*3 );.
14a30 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
14a40 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6d 65  ) return;.    me
14a50 6d 63 70 79 28 61 4e 65 77 2c 20 64 62 2d 3e 61  mcpy(aNew, db->a
14a60 44 62 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  Db, sizeof(db->a
14a70 44 62 5b 30 5d 29 2a 32 29 3b 0a 20 20 7d 65 6c  Db[0])*2);.  }el
14a80 73 65 7b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  se{.    aNew = s
14a90 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 64 62 2d  qliteRealloc(db-
14aa0 3e 61 44 62 2c 20 73 69 7a 65 6f 66 28 64 62 2d  >aDb, sizeof(db-
14ab0 3e 61 44 62 5b 30 5d 29 2a 28 64 62 2d 3e 6e 44  >aDb[0])*(db->nD
14ac0 62 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  b+1) );.    if( 
14ad0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
14ae0 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 20  ;.  }.  db->aDb 
14af0 3d 20 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d  = aNew;.  aNew =
14b00 20 26 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 6e 44   &db->aDb[db->nD
14b10 62 2b 2b 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  b++];.  memset(a
14b20 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
14b30 61 4e 65 77 29 29 3b 0a 20 20 73 71 6c 69 74 65  aNew));.  sqlite
14b40 48 61 73 68 49 6e 69 74 28 26 61 4e 65 77 2d 3e  HashInit(&aNew->
14b50 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  tblHash, SQLITE_
14b60 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
14b70 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69  .  sqliteHashIni
14b80 74 28 26 61 4e 65 77 2d 3e 69 64 78 48 61 73 68  t(&aNew->idxHash
14b90 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
14ba0 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69  RING, 0);.  sqli
14bb0 74 65 48 61 73 68 49 6e 69 74 28 26 61 4e 65 77  teHashInit(&aNew
14bc0 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49  ->trigHash, SQLI
14bd0 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
14be0 30 29 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68  0);.  sqliteHash
14bf0 49 6e 69 74 28 26 61 4e 65 77 2d 3e 61 46 4b 65  Init(&aNew->aFKe
14c00 79 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  y, SQLITE_HASH_S
14c10 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20 0a 20 20  TRING, 1);.  .  
14c20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 71 6c  zName = 0;.  sql
14c30 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
14c40 4e 61 6d 65 2c 20 70 44 62 6e 61 6d 65 2d 3e 7a  Name, pDbname->z
14c50 2c 20 70 44 62 6e 61 6d 65 2d 3e 6e 2c 20 30 29  , pDbname->n, 0)
14c60 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
14c70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
14c80 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  iteDequote(zName
14c90 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
14ca0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
14cb0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
14cc0 5d 2e 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ].zName && sqlit
14cd0 65 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62  eStrICmp(db->aDb
14ce0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
14cf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
14d00 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
14d10 72 73 65 2c 20 22 64 61 74 61 62 61 73 65 20 25  rse, "database %
14d20 7a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  z is already in 
14d30 75 73 65 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  use", zName);.  
14d40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
14d50 7d 0a 20 20 7d 0a 20 20 61 4e 65 77 2d 3e 7a 4e  }.  }.  aNew->zN
14d60 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a  ame = zName;.  z
14d70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
14d80 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 46  teSetNString(&zF
14d90 69 6c 65 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ile, pFilename->
14da0 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 2c  z, pFilename->n,
14db0 20 30 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65   0);.  if( zFile
14dc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14dd0 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 46  sqliteDequote(zF
14de0 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ile);.  rc = sql
14df0 69 74 65 42 74 72 65 65 4f 70 65 6e 28 7a 46 69  iteBtreeOpen(zFi
14e00 6c 65 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53  le, 0, MAX_PAGES
14e10 2c 20 26 61 4e 65 77 2d 3e 70 42 74 29 3b 0a 20  , &aNew->pBt);. 
14e20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
14e30 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
14e40 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
14e50 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 3a 20   open database: 
14e60 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d  %s", zFile);.  }
14e70 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
14e80 69 6c 65 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ile);.  db->flag
14e90 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69  s &= ~SQLITE_Ini
14ea0 74 69 61 6c 69 7a 65 64 3b 0a 20 20 69 66 28 20  tialized;.  if( 
14eb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
14ec0 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 73 71  eturn;.  rc = sq
14ed0 6c 69 74 65 49 6e 69 74 28 70 50 61 72 73 65 2d  liteInit(pParse-
14ee0 3e 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45  >db, &pParse->zE
14ef0 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
14f00 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
14f10 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nErr++;.  }.}../
14f20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14f30 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
14f40 68 65 20 70 61 72 73 65 72 20 74 6f 20 70 72 6f  he parser to pro
14f50 63 65 73 73 20 61 20 44 45 54 41 43 48 20 73 74  cess a DETACH st
14f60 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20  atement:.**.**  
14f70 20 20 44 45 54 41 43 48 20 44 41 54 41 42 41 53    DETACH DATABAS
14f80 45 20 64 62 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 54  E dbname.**.** T
14f90 68 65 20 70 44 62 6e 61 6d 65 20 61 72 67 75 6d  he pDbname argum
14fa0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
14fb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14fc0 69 6e 20 74 68 65 20 44 45 54 41 43 48 20 73 74  in the DETACH st
14fd0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
14fe0 20 73 71 6c 69 74 65 44 65 74 61 63 68 28 50 61   sqliteDetach(Pa
14ff0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
15000 65 6e 20 2a 70 44 62 6e 61 6d 65 29 7b 0a 20 20  en *pDbname){.  
15010 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 20  int i;.  sqlite 
15020 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  *db;..  if( pPar
15030 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 20 72 65  se->explain ) re
15040 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
15050 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
15060 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
15070 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
15080 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 7c  >aDb[i].pBt==0 |
15090 7c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  | db->aDb[i].zNa
150a0 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  me==0 ) continue
150b0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e  ;.    if( strlen
150c0 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d  (db->aDb[i].zNam
150d0 65 29 21 3d 70 44 62 6e 61 6d 65 2d 3e 6e 20 29  e)!=pDbname->n )
150e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
150f0 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
15100 70 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  p(db->aDb[i].zNa
15110 6d 65 2c 20 70 44 62 6e 61 6d 65 2d 3e 7a 2c 20  me, pDbname->z, 
15120 70 44 62 6e 61 6d 65 2d 3e 6e 29 3d 3d 30 20 29  pDbname->n)==0 )
15130 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
15140 28 20 69 3e 3d 64 62 2d 3e 6e 44 62 20 29 7b 0a  ( i>=db->nDb ){.
15150 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
15160 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
15170 75 63 68 20 64 61 74 61 62 61 73 65 3a 20 25 54  uch database: %T
15180 22 2c 20 70 44 62 6e 61 6d 65 29 3b 0a 20 20 20  ", pDbname);.   
15190 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
151a0 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 73 71  f( i<2 ){.    sq
151b0 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
151c0 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 64 65 74  rse, "cannot det
151d0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 25  ached database %
151e0 54 22 2c 20 70 44 62 6e 61 6d 65 29 3b 0a 20 20  T", pDbname);.  
151f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
15200 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73 65  sqliteBtreeClose
15210 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
15220 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ;.  db->aDb[i].p
15230 42 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Bt = 0;.  sqlite
15240 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
15250 65 6d 61 28 64 62 2c 20 30 29 3b 0a 7d 0a        ema(db, 0);.}.