/ Hex Artifact Content
Login

Artifact a965338bee81ce20fb0ce38419e9a9d159e720f0:


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 33 20 32 30  ild.c,v 1.133 20
0310: 30 33 2f 30 33 2f 32 30 20 30 31 3a 31 36 3a 35  03/03/20 01:16:5
0320: 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  8 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 29 7b 0a 20 20 54  har *zName){.  T
0de0: 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  able *p;.  p = s
0df0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0e00: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  b->tblHash, zNam
0e10: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0e20: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
0e40: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
0e50: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
0e60: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
0e70: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
0e80: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
0e90: 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20   that index..** 
0ea0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
0eb0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64  ot found..*/.Ind
0ec0: 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e  ex *sqliteFindIn
0ed0: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
0ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
0ef0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  e){.  Index *p;.
0f00: 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68    p = sqliteHash
0f10: 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48 61 73  Find(&db->idxHas
0f20: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
0f30: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 72 65  (zName)+1);.  re
0f40: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0f50: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
0f60: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
0f70: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f80: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
0f90: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
0fa0: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
0fb0: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
0fc0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
0fd0: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
0fe0: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
0ff0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
1000: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
1010: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
1020: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
1030: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
1040: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
1050: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1060: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1070: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
1080: 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  te *db, Index *p
1090: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  ){.  Index *pOld
10a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
10b0: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
10c0: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
10d0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
10e0: 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a  b->idxHash, p->z
10f0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
1100: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
1110: 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70  if( pOld!=0 && p
1120: 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71  Old!=p ){.    sq
1130: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
1140: 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 4f 6c  db->idxHash, pOl
1150: 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  d->zName, strlen
1160: 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  (pOld->zName)+1,
1170: 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pOld);.  }.  sq
1180: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
1190: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
11a0: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
11b0: 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65  m its table, the
11c0: 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20  n remove.** the 
11d0: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
11e0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
11f0: 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d  and free its mem
1200: 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ory.** structure
1210: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1220: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
1230: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1240: 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
1250: 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  {.  if( pIndex->
1260: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
1270: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 49  pIndex ){.    pI
1280: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
1290: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
12a0: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
12b0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
12c0: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
12d0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
12e0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
12f0: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
1300: 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20 26 26  ){}.    if( p &&
1310: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
1320: 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  x ){.      p->pN
1330: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
1340: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ext;.    }.  }. 
1350: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
1360: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1370: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
1380: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
1390: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69  ation from the i
13a0: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
13b0: 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61 62  bles of.** datab
13c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
13d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13e0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
13f0: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
1400: 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ore the connecti
1410: 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69  on closes.  It i
1420: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75  s also called du
1430: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ring a rollback.
1440: 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ** if there were
1450: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
1460: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
1470: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  action..*/.void 
1480: 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72  sqliteResetInter
1490: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
14a0: 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   *db){.  HashEle
14b0: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
14c0: 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74   temp1;.  Hash t
14d0: 65 6d 70 32 3b 0a 0a 20 20 73 71 6c 69 74 65 48  emp2;..  sqliteH
14e0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46  ashClear(&db->aF
14f0: 4b 65 79 29 3b 0a 20 20 74 65 6d 70 31 20 3d 20  Key);.  temp1 = 
1500: 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 74  db->tblHash;.  t
1510: 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72 69 67 48  emp2 = db->trigH
1520: 61 73 68 3b 0a 20 20 73 71 6c 69 74 65 48 61 73  ash;.  sqliteHas
1530: 68 49 6e 69 74 28 26 64 62 2d 3e 74 72 69 67 48  hInit(&db->trigH
1540: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
1550: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73  _STRING, 0);.  s
1560: 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26  qliteHashClear(&
1570: 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20  db->idxHash);.  
1580: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
1590: 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32  HashFirst(&temp2
15a0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
15b0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
15c0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72 69 67  Elem)){.    Trig
15d0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
15e0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
15f0: 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Elem);.    sqlit
1600: 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70  eDeleteTrigger(p
1610: 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a 20 20  Trigger);.  }.  
1620: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
1630: 26 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c 69 74  &temp2);.  sqlit
1640: 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74  eHashInit(&db->t
1650: 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  blHash, SQLITE_H
1660: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
1670: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
1680: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
1690: 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p1); pElem; pEle
16a0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
16b0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
16c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
16d0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
16e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
16f0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
1700: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
1710: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31  HashClear(&temp1
1720: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
1730: 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e 69 74 69  = ~(SQLITE_Initi
1740: 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45 5f 49 6e  alized|SQLITE_In
1750: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 7d 0a  ternChanges);.}.
1760: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1770: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
1780: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
1790: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
17a0: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
17b0: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
17c0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
17d0: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
17e0: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
17f0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
1800: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
1810: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
1820: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f  */.void sqliteRo
1830: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
1840: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
1850: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
1860: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
1870: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
1880: 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65   sqliteResetInte
1890: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29 3b 0a  rnalSchema(db);.
18a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
18b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18c0: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
18d0: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
18e0: 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e  d sqliteCommitIn
18f0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
1900: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d  lite *db){.  db-
1910: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
1920: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74  ookie = db->next
1930: 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d 3e 66  _cookie;.  db->f
1940: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1950: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
1960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
1970: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
1980: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
1990: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
19a0: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
19b0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
19c0: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
19d0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
19e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
19f0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
1a00: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
1a10: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
1a20: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
1a30: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
1a40: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
1a50: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
1a60: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
1a70: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
1a80: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
1a90: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
1aa0: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
1ab0: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
1ac0: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
1ad0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
1ae0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
1af0: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
1b00: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
1b10: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1b20: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
1b30: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
1b40: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
1b50: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
1b60: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
1b70: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
1b80: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
1b90: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
1ba0: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
1bb0: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
1bc0: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
1bd0: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
1be0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
1bf0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
1c00: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
1c10: 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a  int i;.  Index *
1c20: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
1c30: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
1c40: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
1c50: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
1c60: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  turn;..  /* Dele
1c70: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
1c80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1c90: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
1ca0: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
1cb0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
1cc0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
1cd0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
1ce0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1cf0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
1d00: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1d10: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
1d20: 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20  ete all foreign 
1d30: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
1d40: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
1d50: 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20    The keys.  ** 
1d60: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
1d70: 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  ady been unlinke
1d80: 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61  d from the db->a
1d90: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20  FKey hash table 
1da0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65  .  */.  for(pFKe
1db0: 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b  y=pTable->pFKey;
1dc0: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e   pFKey; pFKey=pN
1dd0: 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e  extFKey){.    pN
1de0: 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d  extFKey = pFKey-
1df0: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
1e00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 48 61  assert( sqliteHa
1e10: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 4b 65  shFind(&db->aFKe
1e20: 79 2c 70 46 4b 65 79 2d 3e 7a 54 6f 2c 73 74 72  y,pFKey->zTo,str
1e30: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
1e40: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
1e50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
1e60: 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  y);.  }..  /* De
1e70: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
1e80: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
1e90: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1ea0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
1eb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1ec0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
1ed0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
1ee0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1ef0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
1f00: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
1f10: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
1f20: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
1f30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1f40: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
1f50: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1f60: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
1f70: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  eSelectDelete(pT
1f80: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
1f90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1fa0: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
1fb0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
1fc0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
1fd0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
1fe0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
1ff0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
2000: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
2010: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
2020: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69  n keys..*/.stati
2030: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  c void sqliteUnl
2040: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
2050: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
2060: 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65  ble *p){.  Table
2070: 20 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a   *pOld;.  FKey *
2080: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 61 73 73  pF1, *pF2;.  ass
2090: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
20a0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
20b0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62 6c  hInsert(&db->tbl
20c0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
20d0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
20e0: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
20f0: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
2100: 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46  d==p );.  for(pF
2110: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
2120: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
2130: 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  rom){.    int nT
2140: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
2150: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46  zTo) + 1;.    pF
2160: 32 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  2 = sqliteHashFi
2170: 6e 64 28 26 64 62 2d 3e 61 46 4b 65 79 2c 20 70  nd(&db->aFKey, p
2180: 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  F1->zTo, nTo);. 
2190: 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20     if( pF2==pF1 
21a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48  ){.      sqliteH
21b0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
21c0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
21d0: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
21e0: 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
21f0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
2200: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
2210: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
2220: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
2230: 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20    if( pF2 ){.   
2240: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
2250: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
2260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2270: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65    }.  sqliteDele
2280: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
2290: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
22a0: 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ct the name of a
22b0: 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20 69   user table or i
22c0: 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65  ndex from a toke
22d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  n..**.** Space t
22e0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20  o hold the name 
22f0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2300: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
2310: 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66  and must.** be f
2320: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
2330: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
2340: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61 62  .char *sqliteTab
2350: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
2360: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
2370: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
2380: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61  qliteStrNDup(pNa
2390: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
23a0: 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  ;.  sqliteDequot
23b0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
23c0: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
23d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
23e0: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70 70   to open the app
23f0: 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72 20  ropriate master 
2400: 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62 6c  table.  The tabl
2410: 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c  e.** opened will
2420: 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   be SQLITE_MASTE
2430: 52 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  R for persistent
2440: 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20   tables and .** 
2450: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
2460: 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ER for temporary
2470: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74 61   tables.  The ta
2480: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  ble is opened.**
2490: 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f   on cursor 0..*/
24a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65 6e  .void sqliteOpen
24b0: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
24c0: 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70 29   *v, int isTemp)
24d0: 7b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  {.  sqliteVdbeAd
24e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
24f0: 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20  r, isTemp, 0);. 
2500: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2510: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
2520: 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 2);.}../*.*
2530: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
2540: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
2550: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2560: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
2570: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
2580: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
2590: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
25a0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
25b0: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
25c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
25d0: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
25e0: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
25f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
2600: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
2610: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
2620: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
2630: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  he table name.  
2640: 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f  The.** pStart to
2650: 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54  ken is the CREAT
2660: 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74  E and pName is t
2670: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  he table name.  
2680: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
2690: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
26a0: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
26b0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
26c0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
26d0: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
26e0: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
26f0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
2700: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
2710: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
2720: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
2730: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
2740: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
2750: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
2760: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
2770: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
2780: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
2790: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
27a0: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
27b0: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
27c0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
27d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
27e0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
27f0: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
2800: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
2810: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
2820: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2830: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
2840: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
2850: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
2860: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
2870: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
2880: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2890: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
28a0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
28b0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
28c0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
28d0: 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  id sqliteStartTa
28e0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
28f0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
2900: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
2910: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
2920: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
2930: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
2940: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e   *pName,    /* N
2950: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
2960: 76 69 65 77 20 74 6f 20 63 72 65 61 74 65 20 2a  view to create *
2970: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
2980: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2990: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
29a0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
29b0: 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72  View       /* Tr
29c0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
29d0: 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  VIEW */.){.  Tab
29e0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e  le *pTable;.  In
29f0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61  dex *pIdx;.  cha
2a00: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
2a10: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
2a20: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
2a30: 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73  .  pParse->sFirs
2a40: 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74  tToken = *pStart
2a50: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
2a60: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
2a70: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
2a80: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
2a90: 74 75 72 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  turn;.#ifndef SQ
2aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
2ab0: 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
2ac0: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
2ad0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
2ae0: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
2af0: 45 28 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b  E(isTemp), 0) ){
2b00: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2b10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
2b20: 72 6e 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20  rn;.  }.  {.    
2b30: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 69 66  int code;.    if
2b40: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
2b50: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
2b60: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
2b70: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
2b80: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
2b90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
2ba0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
2bb0: 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  E_VIEW;.      }.
2bc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bd0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
2be0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
2bf0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
2c00: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
2c10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
2c20: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
2c30: 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  E_TABLE;.      }
2c40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2c50: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
2c60: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
2c70: 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
2c80: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
2c90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
2ca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2cb0: 66 0a 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  f. ..  /* Before
2cc0: 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74   trying to creat
2cd0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
2ce0: 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ble, make sure t
2cf0: 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a  he Btree for.  *
2d00: 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72  * holding tempor
2d10: 61 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70  ary tables is op
2d20: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  en..  */.  if( i
2d30: 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62  sTemp && db->aDb
2d40: 5b 31 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  [1].pBt==0 ){.  
2d50: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2d60: 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c  eBtreeOpen(0, 0,
2d70: 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d   MAX_PAGES, &db-
2d80: 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[1].pBt);.  
2d90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2da0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2db0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
2dc0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2dd0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
2de0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
2df0: 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
2e00: 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
2e10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
2e20: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  ", 0);.      pPa
2e30: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
2e40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2e50: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
2e60: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
2e70: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ans ){.      rc 
2e80: 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67  = sqliteBtreeBeg
2e90: 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  inTrans(db->aDb[
2ea0: 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 69  1].pBt);.      i
2eb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ed0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
2ee0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2ef0: 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20  unable to get a 
2f00: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a  write lock on ".
2f10: 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74            "the t
2f20: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
2f30: 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20  e file", 0);.   
2f40: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
2f50: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
2f60: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
2f70: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
2f80: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
2f90: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
2fa0: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
2fb0: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
2fc0: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
2fd0: 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20  name.  Issue an 
2fe0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
2ff0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20   it does..  **. 
3000: 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65   ** If we are re
3010: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c  -reading the sql
3020: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3030: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63   because of a sc
3040: 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65  hema.  ** change
3050: 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61   and a new perma
3060: 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f  nent table is fo
3070: 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63  und whose name c
3080: 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a  ollides with.  *
3090: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65  * an existing te
30a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
30b0: 68 65 6e 20 69 67 6e 6f 72 65 20 74 68 65 20 6e  hen ignore the n
30c0: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
30d0: 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  le..  ** We will
30e0: 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e   continue parsin
30f0: 67 2c 20 62 75 74 20 74 68 65 20 70 50 61 72 73  g, but the pPars
3100: 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 66 6c 61  e->nameClash fla
3110: 67 20 77 69 6c 6c 20 62 65 20 73 65 74 0a 20 20  g will be set.  
3120: 2a 2a 20 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  ** so we will kn
3130: 6f 77 20 74 6f 20 64 69 73 63 61 72 64 20 74 68  ow to discard th
3140: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6f  e table record o
3150: 6e 63 65 20 70 61 72 73 69 6e 67 20 68 61 73 20  nce parsing has 
3160: 66 69 6e 69 73 68 65 64 2e 0a 20 20 2a 2f 0a 20  finished..  */. 
3170: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
3180: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
3190: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
31a0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  le!=0 ){.    if(
31b0: 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20   pTable->isTemp 
31c0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
31d0: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61  lag ){.      pPa
31e0: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d  rse->nameClash =
31f0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
3200: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
3210: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3220: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
3230: 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  , 0, pName->z, p
3240: 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Name->n,.       
3250: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
3260: 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sts", 0, 0);.   
3270: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3280: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ame);.      pPar
3290: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
32a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
32b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
32c0: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 20 3d  rse->nameClash =
32d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
32e0: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
32f0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
3300: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
3310: 20 20 28 21 70 49 64 78 2d 3e 70 54 61 62 6c 65    (!pIdx->pTable
3320: 2d 3e 69 73 54 65 6d 70 20 7c 7c 20 21 70 50 61  ->isTemp || !pPa
3330: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29  rse->initFlag) )
3340: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
3350: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3360: 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69  ErrMsg, "there i
3370: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
3380: 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20  ex named ", .   
3390: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
33a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
33b0: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
33c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
33d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
33e0: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
33f0: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
3400: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
3410: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3420: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3430: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3440: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
3450: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
3460: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
3470: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
3480: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
3490: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
34a0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
34b0: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 3d 20 69 73  ble->isTemp = is
34c0: 54 65 6d 70 3b 0a 20 20 69 66 28 20 70 50 61 72  Temp;.  if( pPar
34d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
34e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
34f0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
3500: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
3510: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
3520: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65  pTable;..  /* Be
3530: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
3540: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
3550: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
3560: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
3570: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
3580: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
3590: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
35a0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
35b0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
35c0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
35d0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
35e0: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
35f0: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
3600: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
3610: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
3620: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
3630: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
3640: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
3650: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
3660: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
3670: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
3680: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
3690: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
36a0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
36b0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
36c0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
36d0: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
36e0: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  w..  */.  if( !p
36f0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
3700: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65  && (v = sqliteGe
3710: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
3720: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42  0 ){.    sqliteB
3730: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3740: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
3750: 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21  Temp);.    if( !
3760: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
3770: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3780: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
3790: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  b->file_format, 
37a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
37b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
37c0: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29  SetCookie, 0, 1)
37d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
37e0: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
37f0: 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  e(v, isTemp);.  
3800: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3810: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
3820: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
3830: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3840: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
3850: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3860: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
3870: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
3880: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3890: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
38a0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
38b0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
38c0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
38d0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
38e0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
38f0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
3900: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
3910: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
3920: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
3930: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
3940: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
3950: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
3960: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
3970: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
3980: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
3990: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
39a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
39b0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
39c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
39d0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
39e0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
39f0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
3a00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
3a10: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  r *z = 0;.  Colu
3a20: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
3a30: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
3a40: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
3a50: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  urn;.  sqliteSet
3a60: 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d  NString(&z, pNam
3a70: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3a80: 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0);.  if( z==0 )
3a90: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
3aa0: 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  eDequote(z);.  f
3ab0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
3ac0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
3ad0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
3ae0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
3af0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
3b00: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3b10: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3b20: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
3b30: 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20  umn name: ", z, 
3b40: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
3b50: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3b60: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
3b70: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3b80: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
3b90: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
3ba0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
3bb0: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
3bc0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
3bd0: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
3be0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
3bf0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
3c00: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
3c10: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
3c20: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
3c30: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
3c40: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
3c50: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
3c60: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
3c70: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
3c80: 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64  .  pCol->sortOrd
3c90: 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  er = SQLITE_SO_N
3ca0: 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  UM;.  p->nCol++;
3cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3cc0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3cd0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
3ce0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
3cf0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
3d00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
3d10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
3d20: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
3d30: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
3d40: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
3d50: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3d60: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
3d70: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
3d80: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
3d90: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
3da0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3db0: 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  iteAddNotNull(Pa
3dc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
3dd0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
3de0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
3df0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3e00: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3e10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
3e20: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
3e30: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
3e40: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
3e50: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
3e60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3e70: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
3e80: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
3e90: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
3ea0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
3eb0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
3ec0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
3ed0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
3ee0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
3ef0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
3f00: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
3f10: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
3f20: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
3f30: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
3f40: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
3f50: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
3f60: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
3f70: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
3f80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
3f90: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
3fa0: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
3fb0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
3fc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
3fd0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
3fe0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
3ff0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
4000: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  eAddColumnType(P
4010: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4020: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
4030: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
4040: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
4050: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
4060: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
4070: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
4080: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
4090: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
40a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
40b0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
40c0: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
40d0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
40e0: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
40f0: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
4100: 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  Last->n + Addr(p
4110: 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28  Last->z) - Addr(
4120: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71  pFirst->z);.  sq
4130: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
4140: 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c  z, pFirst->z, n,
4150: 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a   0);.  z = *pz;.
4160: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
4170: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
4180: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
4190: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
41a0: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
41b0: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
41c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
41d0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
41e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
41f0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
4200: 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72  ){.    pCol->sor
4210: 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 43  tOrder = sqliteC
4220: 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e 29  ollateType(z, n)
4230: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4240: 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  Col->sortOrder =
4250: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
4260: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
4270: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20   given token is 
4280: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
4290: 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63  e for the last c
42a0: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a  olumn added to.*
42b0: 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  * the table curr
42c0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
42d0: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d  truction.  If "m
42e0: 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75  inusFlag" is tru
42f0: 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  e, it.** means t
4300: 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77  he value token w
4310: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
4320: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a   minus sign..**.
4330: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4340: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4350: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4360: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4370: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4380: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4390: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
43a0: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
43b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
43c0: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e   Token *pVal, in
43d0: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
43e0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
43f0: 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  i;.  char **pz;.
4400: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
4410: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
4420: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
4430: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
4440: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
4450: 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b    pz = &p->aCol[
4460: 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20  i].zDflt;.  if( 
4470: 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
4480: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4490: 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56  g(pz, "-", 1, pV
44a0: 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20  al->z, pVal->n, 
44b0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
44c0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
44d0: 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  g(pz, pVal->z, p
44e0: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a  Val->n, 0);.  }.
44f0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
4500: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  *pz);.}../*.** D
4510: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
4520: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
4530: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
4540: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
4550: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
4560: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
4570: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
4580: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
4590: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
45a0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
45b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
45c0: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
45d0: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
45e0: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
45f0: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
4600: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
4610: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
4620: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
4630: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
4640: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
4650: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
4660: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
4670: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
4680: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
4690: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
46a0: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
46b0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
46c0: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
46d0: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
46e0: 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20   as the row id. 
46f0: 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20   (Exception:.** 
4700: 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
4710: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
4720: 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73   older databases
4730: 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
4740: 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
4750: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e  format version n
4760: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
4770: 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20  an 1.)  Set the 
4780: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
4790: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
47a0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
47b0: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
47c0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
47d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
47e0: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
47f0: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
4800: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
4810: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
4820: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
4830: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
4840: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
4850: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
4860: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
4870: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
4880: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
4890: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
48a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
48b0: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
48c0: 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65  liteAddPrimaryKe
48d0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
48e0: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
48f0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
4900: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
4910: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
4920: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
4930: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
4940: 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d   -1;.  if( pTab=
4950: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
4960: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
4970: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
4980: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
4990: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
49a0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
49b0: 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  le \"", pTab->zN
49c0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c  ame, .        "\
49d0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
49e0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
49f0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
4a00: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
4a10: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
4a20: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
4a30: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
4a40: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
4a50: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
4a60: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
4a70: 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
4a80: 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66  >nId==1 ){.    f
4a90: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
4aa0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
4ab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
4ac0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
4ad0: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  st->a[0].zName, 
4ae0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
4af0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
4b00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4b10: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
4b20: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
4b30: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
4b40: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
4b50: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
4b60: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
4b70: 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20  _format>=1 && . 
4b80: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
4b90: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
4ba0: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
4bb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
4bc0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
4bd0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
4be0: 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  nf = onError;.  
4bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4c00: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  eCreateIndex(pPa
4c10: 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  rse, 0, 0, pList
4c20: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29  , onError, 0, 0)
4c30: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
4c40: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
4c50: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
4c60: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
4c70: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
4c80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4c90: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
4ca0: 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 20 67 69  ollating type gi
4cb0: 76 65 6e 20 61 20 74 79 70 65 20 6e 61 6d 65 2e  ven a type name.
4cc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
4cd0: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 65 78  tion type is tex
4ce0: 74 20 28 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  t (SQLITE_SO_TEX
4cf0: 54 29 20 69 66 20 74 68 65 20 74 79 70 65 0a 2a  T) if the type.*
4d00: 2a 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  * name contains 
4d10: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 73 74  the character st
4d20: 72 65 61 6d 20 22 74 65 78 74 22 20 6f 72 20 22  ream "text" or "
4d30: 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22 63 6c 6f  blob" or.** "clo
4d40: 62 22 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 74  b".  Any other t
4d50: 79 70 65 20 6e 61 6d 65 20 69 73 20 63 6f 6c 6c  ype name is coll
4d60: 61 74 65 64 20 61 73 20 6e 75 6d 65 72 69 63 0a  ated as numeric.
4d70: 2a 2a 20 28 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  ** (SQLITE_SO_NU
4d80: 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  M)..*/.int sqlit
4d90: 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 63 6f 6e  eCollateType(con
4da0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
4db0: 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e  int nType){.  in
4dc0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4dd0: 69 3c 6e 54 79 70 65 2d 31 3b 20 69 2b 2b 29 7b  i<nType-1; i++){
4de0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 54 79  .    switch( zTy
4df0: 70 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 63  pe[i] ){.      c
4e00: 61 73 65 20 27 62 27 3a 0a 20 20 20 20 20 20 63  ase 'b':.      c
4e10: 61 73 65 20 27 42 27 3a 20 7b 0a 20 20 20 20 20  ase 'B': {.     
4e20: 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65 2d 33     if( i<nType-3
4e30: 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43   && sqliteStrNIC
4e40: 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 62 6c  mp(&zType[i],"bl
4e50: 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20  ob",4)==0 ){.   
4e60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4e70: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
4e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4e90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4ea0: 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a 20       case 'c':. 
4eb0: 20 20 20 20 20 63 61 73 65 20 27 43 27 3a 20 7b       case 'C': {
4ec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
4ed0: 54 79 70 65 2d 33 20 26 26 20 28 73 71 6c 69 74  Type-3 && (sqlit
4ee0: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
4ef0: 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d 30  [i],"char",4)==0
4f00: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4f20: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a  qliteStrNICmp(&z
4f30: 54 79 70 65 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34  Type[i],"clob",4
4f40: 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 29 7b  )==0).        ){
4f50: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4f60: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  n SQLITE_SO_TEXT
4f70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4f80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4f90: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 78   }.      case 'x
4fa0: 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 58  ':.      case 'X
4fb0: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ': {.        if(
4fc0: 20 69 3e 3d 32 20 26 26 20 73 71 6c 69 74 65 53   i>=2 && sqliteS
4fd0: 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69  trNICmp(&zType[i
4fe0: 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30  -2],"text",4)==0
4ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
5010: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EXT;.        }. 
5020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5030: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
5040: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 62  ult: {.        b
5050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5060: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5070: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
5080: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
50a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
50b0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
50c0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
50d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
50e0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 43 4f  tatement.  A "CO
50f0: 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 68 61  LLATE" clause ha
5100: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
5110: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
5120: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5130: 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72  he Column.sortOr
5140: 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  der on.** the co
5150: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
5160: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5170: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5180: 65 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  eAddCollateType(
5190: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
51a0: 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b 0a 20 20  nt collType){.  
51b0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
51c0: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
51d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
51e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
51f0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
5200: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
5210: 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  Col[i].sortOrder
5220: 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a   = collType;.}..
5230: 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69  /*.** Come up wi
5240: 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20  th a new random 
5250: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63  value for the sc
5260: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61  hema cookie.  Ma
5270: 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e  ke sure.** the n
5280: 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66  ew value is diff
5290: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
52a0: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ld..**.** The sc
52b0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
52c0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
52d0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
52e0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
52f0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
5300: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
5310: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
5320: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
5330: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
5340: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
5350: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
5360: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
5370: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
5380: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
5390: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
53a0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
53b0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
53c0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
53d0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
53e0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
53f0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
5400: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
5410: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
5420: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
5430: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
5440: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
5450: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
5460: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
5470: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
5480: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
5490: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
54a0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
54b0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
54c0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
54d0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
54e0: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
54f0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
5500: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
5510: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
5520: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
5530: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
5540: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
5550: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 56 64  e(sqlite *db, Vd
5560: 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 64 62  be *v){.  if( db
5570: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64  ->next_cookie==d
5580: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
5590: 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64  _cookie ){.    d
55a0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d  b->next_cookie =
55b0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65   db->aDb[0].sche
55c0: 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69  ma_cookie + sqli
55d0: 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 2b  teRandomByte() +
55e0: 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   1;.    db->flag
55f0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5600: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 73  rnChanges;.    s
5610: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5620: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5630: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30  ->next_cookie, 0
5640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
5650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5660: 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20  Cookie, 0, 0);. 
5670: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73   }.}../*.** Meas
5680: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
5690: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
56a0: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
56b0: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
56c0: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
56d0: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
56e0: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
56f0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
5700: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
5710: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
5720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5730: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
5740: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
5750: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51  t n;.  int needQ
5760: 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  uote = 0;.  for(
5770: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
5780: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
5790: 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65  '\'' ){ n++; nee
57a0: 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a  dQuote=1; }.  }.
57b0: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65    return n + nee
57c0: 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a  dQuote*2;.}../*.
57d0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e  ** Write an iden
57e0: 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20  tifier onto the 
57f0: 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  end of the given
5800: 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a   string.  Add.**
5810: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
5820: 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s as needed..*/.
5830: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
5840: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
5850: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
5860: 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c  Ident){.  int i,
5870: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
5880: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
5890: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
58a0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
58b0: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
58c0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
58d0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
58e0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
58f0: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
5900: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
5910: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
5920: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
5930: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
5940: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
5950: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
5960: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
5970: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
5980: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
5990: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
59a0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
59b0: 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b  nt[j]=='\'' ) z[
59c0: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d  i++] = '\'';.  }
59d0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
59e0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
59f0: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
5a00: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
5a10: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
5a20: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5a30: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
5a40: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
5a50: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
5a60: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
5a70: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
5a80: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
5a90: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
5aa0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
5ab0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
5ac0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
5ae0: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
5af0: 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  t(Table *p){.  i
5b00: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
5b10: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
5b20: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
5b30: 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b   *zEnd;.  n = 0;
5b40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5b50: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
5b60: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
5b70: 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  h(p->aCol[i].zNa
5b80: 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  me);.  }.  n += 
5b90: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
5ba0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34  Name);.  if( n<4
5bb0: 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  0 ){.    zSep = 
5bc0: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
5bd0: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
5be0: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
5bf0: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
5c00: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
5c10: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
5c20: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
5c30: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
5c40: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
5c50: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20  iteMallocRaw( n 
5c60: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
5c70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5c80: 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d  strcpy(zStmt, p-
5c90: 3e 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41 54  >isTemp ? "CREAT
5ca0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a  E TEMP TABLE " :
5cb0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
5cc0: 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28  );.  k = strlen(
5cd0: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
5ce0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
5cf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
5d00: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
5d10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5d20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
5d30: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
5d40: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
5d50: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
5d60: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
5d70: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
5d80: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61  (zStmt, &k, p->a
5d90: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
5da0: 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74   }.  strcpy(&zSt
5db0: 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20  mt[k], zEnd);.  
5dc0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
5dd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5de0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
5df0: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
5e00: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
5e10: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
5e20: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5e30: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
5e40: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
5e50: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
5e60: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
5e70: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
5e80: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5e90: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
5ea0: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
5eb0: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
5ec0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
5ed0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
5ee0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
5ef0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
5f00: 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e  e on disk,.** un
5f10: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 74  less this is a t
5f20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
5f30: 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20  r initFlag==1.  
5f40: 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31  When initFlag==1
5f50: 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  ,.** it means we
5f60: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
5f70: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
5f80: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
5f90: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
5fa0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
5fb0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
5fc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
5fd0: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
5fe0: 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f  ntly changes, so
5ff0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
6000: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
6010: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
6020: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6030: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
6040: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
6050: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
6060: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
6070: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
6080: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
6090: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
60a0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
60b0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
60c0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
60d0: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
60e0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
60f0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
6100: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
6110: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
6120: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
6130: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
6140: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
6150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6160: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
6170: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
6180: 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  End, Select *pSe
6190: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
61a0: 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  p;.  sqlite *db 
61b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
61c0: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
61d0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
61e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
61f0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
6200: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
6210: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
6220: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
6230: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
6240: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
6250: 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
6260: 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  m a SELECT, then
6270: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20   construct the. 
6280: 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75   ** list of colu
6290: 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78 74  mns and the text
62a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
62b0: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
62c0: 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  t ){.    Table *
62d0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
62e0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
62f0: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
6300: 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70  lect);.    if( p
6310: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
6320: 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rn;.    assert( 
6330: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
6340: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
6350: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
6360: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
6370: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c  ->aCol;.    pSel
6380: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
6390: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
63a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
63b0: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
63c0: 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  SelTab);.  }..  
63d0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c  /* If the initFl
63e0: 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  ag is 1 it means
63f0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
6400: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
6410: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
6420: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
6430: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
6440: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
6450: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
6460: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
6470: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
6480: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
6490: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
64a0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
64b0: 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  e pParse->newTnu
64c0: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
64d0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
64e0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
64f0: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
6500: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
6510: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
6520: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
6530: 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74  Flag ){.    p->t
6540: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
6550: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
6560: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
6570: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
6580: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
6590: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
65a0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
65b0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
65c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
65d0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
65e0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
65f0: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
6600: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
6610: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
6620: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
6630: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
6640: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
6650: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
6660: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
6670: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
6680: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
6690: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
66a0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
66b0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
66c0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
66d0: 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  v;..    v = sqli
66e0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
66f0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
6700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6710: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
6720: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
6730: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
6740: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6750: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
6760: 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 73  eTable, 0, p->is
6770: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
6780: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6790: 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26  v, -1, (char *)&
67a0: 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e  p->tnum, P3_POIN
67b0: 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TER);.    }else{
67c0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
67d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
67e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
67f0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
6800: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
6810: 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  m = 0;.    sqlit
6820: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6830: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
6840: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6850: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6860: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
6870: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
6880: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6890: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
68a0: 22 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54  "table", P3_STAT
68b0: 49 43 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  IC);.    }else{.
68c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
68d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
68e0: 22 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49  "view", P3_STATI
68f0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
6900: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6910: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
6920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6930: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6940: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54   p->zName, P3_ST
6950: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
6960: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6970: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
6980: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6990: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d  angeP3(v, -1, p-
69a0: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
69b0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  C);.    sqliteVd
69c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
69d0: 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 4, 0);.    sq
69e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
69f0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
6a00: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  );.    if( pSele
6a10: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ct ){.      char
6a20: 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c   *z = createTabl
6a30: 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  eStmt(p);.      
6a40: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
6a50: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ) : 0;.      sql
6a60: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6a70: 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  v, -1, z, n);.  
6a80: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6a90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
6ab0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  !=0 );.      n =
6ac0: 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
6ad0: 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46   Addr(pParse->sF
6ae0: 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  irstToken.z) + 1
6af0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6b00: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6b10: 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  , pParse->sFirst
6b20: 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20  Token.z, n);.   
6b30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
6b40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
6b50: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a  eRecord, 5, 0);.
6b60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6b70: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
6b80: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
6b90: 69 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29  if( !p->isTemp )
6ba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
6bb0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
6bc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6bd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6be0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
6bf0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
6c00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6c10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6c20: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 73 54 65  Integer, p->isTe
6c30: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mp, 0);.      sq
6c40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6c50: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
6c60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
6c70: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
6c80: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
6c90: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
6ca0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20  , SRT_Table, 1, 
6cb0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
6cc0: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
6cd0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6ce0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  se);.  }..  /* A
6cf0: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
6d00: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
6d10: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
6d20: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
6d30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
6d40: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d  rse->nameClash==
6d50: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69  0 || pParse->ini
6d60: 74 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  tFlag==1 );.  if
6d70: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
6d80: 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  n==0 && pParse->
6d90: 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 26 26 20  nameClash==0 && 
6da0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
6db0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
6dc0: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
6dd0: 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Key;.    pOld = 
6de0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
6df0: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  (&db->tblHash, p
6e00: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
6e10: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
6e20: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
6e30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6e40: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
6e50: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
6e60: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
6e70: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
6e80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6e90: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
6ea0: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
6eb0: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
6ec0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
6ed0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
6ee0: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
6ef0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
6f00: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 48 61  extTo = sqliteHa
6f10: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 4b 65  shFind(&db->aFKe
6f20: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
6f30: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
6f40: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
6f50: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
6f60: 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b  To, nTo, pFKey);
6f70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
6f80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
6f90: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
6fa0: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
6fb0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
6fc0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
6fe0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6ff0: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
7000: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
7010: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
7020: 74 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  teCreateView(.  
7030: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7040: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
7050: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
7060: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
7070: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
7080: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
7090: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
70a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
70b0: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e,      /* The t
70c0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
70d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
70e0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
70f0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
7100: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
7110: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
7120: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
7130: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
7140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
7150: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
7160: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
7170: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
7180: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7190: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
71a0: 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
71b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67  ble(pParse, pBeg
71c0: 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d  in, pName, isTem
71d0: 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61  p, 1);.  p = pPa
71e0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
71f0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
7200: 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
7210: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
7220: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
7230: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
7240: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
7250: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
7260: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
7270: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
7280: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
7290: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
72a0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
72b0: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
72c0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
72d0: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
72e0: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
72f0: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
7300: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
7310: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
7320: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
7330: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
7340: 65 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  e_exec() call re
7350: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
7360: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7370: 65 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  eSelectDup(pSele
7380: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ct);.  sqliteSel
7390: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
73a0: 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  t);.  if( !pPars
73b0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
73c0: 20 20 20 73 71 6c 69 74 65 56 69 65 77 47 65 74     sqliteViewGet
73d0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
73e0: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
73f0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
7400: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
7410: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
7420: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
7430: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
7440: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
7450: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
7460: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
7470: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
7480: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
7490: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
74a0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
74b0: 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73  0;.  n = ((int)s
74c0: 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42  End.z) - (int)pB
74d0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70  egin->z;.  z = p
74e0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
74f0: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
7500: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
7510: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
7520: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
7530: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
7540: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
7550: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
7560: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
7570: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
7580: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
7590: 20 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65    sqliteEndTable
75a0: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
75b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
75c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
75d0: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
75e0: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
75f0: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
7600: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
7610: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7620: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
7630: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
7640: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
7650: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
7660: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
7670: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
7680: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
7690: 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  are->zErrMsg..*/
76a0: 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47  .int sqliteViewG
76b0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
76c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
76d0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45  le *pTable){.  E
76e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
76f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
7700: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
7710: 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  b;.  int nErr = 
7720: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  0;..  assert( pT
7730: 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  able );..  /* A 
7740: 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
7750: 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
7760: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
7770: 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
7780: 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
7790: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
77a0: 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
77b0: 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
77c0: 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
77d0: 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
77e0: 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
77f0: 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
7800: 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
7810: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
7820: 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
7830: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
7840: 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
7850: 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
7860: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
7870: 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
7880: 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
7890: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
78a0: 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
78b0: 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
78c0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
78d0: 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
78e0: 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
78f0: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
7900: 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20  , this error is 
7910: 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c  caught previousl
7920: 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c  y and so the fol
7930: 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a  lowing test.  **
7940: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66   should always f
7950: 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ail.  But we wil
7960: 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c  l leave it in pl
7970: 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73  ace just to be s
7980: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  afe..  */.  if( 
7990: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
79a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
79b0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
79c0: 45 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c  ErrMsg, "view ",
79d0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
79e0: 20 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69           " is ci
79f0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
7a00: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
7a10: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
7a20: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
7a30: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
7a40: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
7a50: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
7a60: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
7a70: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
7a80: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
7a90: 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c  ct ); /* If nCol
7aa0: 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65  ==0, then pTable
7ab0: 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20   must be a VIEW 
7ac0: 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62  */.  pSel = pTab
7ad0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  le->pSelect;..  
7ae0: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  /* Note that the
7af0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52   call to sqliteR
7b00: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
7b10: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
7b20: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
7b30: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
7b40: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
7b50: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
7b60: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
7b70: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
7b80: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
7b90: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
7ba0: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
7bb0: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
7bc0: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
7bd0: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
7be0: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
7bf0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
7c00: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
7c10: 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70  pEList);.  if( p
7c20: 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29  Sel->pEList==0 )
7c30: 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69  {.    pSel->pELi
7c40: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
7c50: 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d   return 1;  /* M
7c60: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
7c70: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43    }.  pTable->nC
7c80: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54  ol = -1;.  pSelT
7c90: 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c  ab = sqliteResul
7ca0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
7cb0: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
7cc0: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
7cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
7ce0: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
7cf0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
7d00: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
7d10: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
7d20: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
7d30: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
7d40: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
7d50: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
7d60: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
7d70: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
7d80: 62 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  b);.    pParse->
7d90: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
7da0: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
7db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7dc0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
7dd0: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
7de0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55  .  sqliteSelectU
7df0: 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73  nbind(pSel);.  s
7e00: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
7e10: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
7e20: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
7e30: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
7e40: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a  turn nErr;  .}..
7e50: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
7e60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
7e70: 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c  m the VIEW pTabl
7e80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
7e90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7ea0: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68  whenever any oth
7eb0: 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  er table or view
7ec0: 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a   is modified..**
7ed0: 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64   The view passed
7ee0: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
7ef0: 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20  ne might depend 
7f00: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
7f10: 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65  rectly.** on the
7f20: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c   modified or del
7f30: 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65  eted table so we
7f40: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74   need to clear t
7f50: 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a  he old column.**
7f60: 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74   names so that t
7f70: 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  hey will be reco
7f80: 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
7f90: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
7fa0: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
7fb0: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
7fc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
7fd0: 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54   pTable==0 || pT
7fe0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  able->pSelect==0
7ff0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8000: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30   pTable->nCol==0
8010: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8020: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
8030: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8040: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8050: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
8060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8070: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
8080: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
8090: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
80a0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
80b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
80c0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
80d0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
80e0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
80f0: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
8100: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
8110: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
8120: 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69  ery VIEW..*/.voi
8130: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8140: 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29  tAll(sqlite *db)
8150: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8160: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
8170: 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72 65 73  s & SQLITE_Unres
8180: 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20 72 65  etViews)==0 ) re
8190: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
81a0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
81b0: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  b->tblHash); i; 
81c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
81d0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
81e0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
81f0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
8200: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
8210: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8220: 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  ViewResetColumnN
8230: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
8240: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
8250: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72  s &= ~SQLITE_Unr
8260: 65 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a  esetViews;.}../*
8270: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
8280: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
8290: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
82a0: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
82b0: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
82c0: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
82d0: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
82e0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
82f0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c  able *sqliteTabl
8300: 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65  eFromToken(Parse
8310: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8320: 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a  *pTok){.  char *
8330: 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zName;.  Table *
8340: 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  pTab;.  zName = 
8350: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
8360: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a  romToken(pTok);.
8370: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8380: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
8390: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
83a0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
83b0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
83c0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
83d0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
83e0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
83f0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8400: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
8410: 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  ble: ", 0, .    
8420: 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f      pTok->z, pTo
8430: 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  k->n, 0);.    pP
8440: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8450: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
8460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8470: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8480: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
8490: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
84a0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
84b0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
84c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
84d0: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
84e0: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61  oid sqliteDropTa
84f0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
8500: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
8510: 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
8520: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
8530: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
8540: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a  base;.  sqlite *
8550: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8560: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
8570: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
8580: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
8590: 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20  eturn;.  pTable 
85a0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f  = sqliteTableFro
85b0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  mToken(pParse, p
85c0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
85d0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
85e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
85f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
8600: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41  ON.  if( sqliteA
8610: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
8620: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
8630: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
8640: 62 6c 65 2d 3e 69 73 54 65 6d 70 29 2c 30 29 29  ble->isTemp),0))
8650: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8660: 7d 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  }.  {.    int co
8670: 64 65 3b 0a 20 20 20 20 69 66 28 20 69 73 56 69  de;.    if( isVi
8680: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
8690: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29  pTable->isTemp )
86a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
86b0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
86c0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
86d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
86e0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
86f0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
8700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8710: 66 28 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  f( pTable->isTem
8720: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
8730: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
8740: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
8750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8760: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
8770: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
8780: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8790: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
87a0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
87b0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
87c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
87d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
87e0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
87f0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
8800: 45 4c 45 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a  ELETE, pTable->z
8810: 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
8820: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8830: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
8840: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
8850: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
8860: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8870: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
8880: 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e ", pTable->zNa
8890: 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61  me, .       " ma
88a0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
88b0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
88c0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
88d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
88e0: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c   isView && pTabl
88f0: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  e->pSelect==0 ){
8900: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8910: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8920: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
8930: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
8940: 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20   table ",.      
8950: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
8960: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8970: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
8980: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  n;.  }.  if( !is
8990: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
89a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
89b0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
89c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
89d0: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
89e0: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 22  to delete view "
89f0: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
8a00: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
8a10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
8a20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
8a30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
8a40: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
8a50: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
8a60: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
8a70: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
8a80: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
8a90: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
8aa0: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
8ab0: 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61  ic VdbeOp dropTa
8ac0: 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ble[] = {.      
8ad0: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
8ae0: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d   0, ADDR(8),  0}
8af0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
8b00: 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ing,     0, 0,  
8b10: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
8b20: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
8b30: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
8b40: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
8b50: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
8b60: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
8b70: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
8b80: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
8b90: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
8ba0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
8bb0: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
8bc0: 28 37 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (7),  0},.      
8bd0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
8be0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
8bf0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
8c00: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
8c10: 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a  (3),  0}, /* 7 *
8c20: 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64  /.    };.    Ind
8c30: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72  ex *pIdx;.    Tr
8c40: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
8c50: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
8c60: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
8c70: 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 6c 65  Parse, 0, pTable
8c80: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  ->isTemp);.    s
8c90: 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54  qliteOpenMasterT
8ca0: 61 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e  able(v, pTable->
8cb0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 2f 2a 20  isTemp);.    /* 
8cc0: 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
8cd0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
8ce0: 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
8cf0: 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20  g dropped */.   
8d00: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
8d10: 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  le->pTrigger;.  
8d20: 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
8d30: 72 20 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  r ){.      Token
8d40: 20 74 74 3b 0a 20 20 20 20 20 20 74 74 2e 7a 20   tt;.      tt.z 
8d50: 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  = pTable->pTrigg
8d60: 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20  er->name;.      
8d70: 74 74 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  tt.n = strlen(pT
8d80: 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e  able->pTrigger->
8d90: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
8da0: 69 74 65 44 72 6f 70 54 72 69 67 67 65 72 28 70  iteDropTrigger(p
8db0: 50 61 72 73 65 2c 20 26 74 74 2c 20 31 29 3b 0a  Parse, &tt, 1);.
8dc0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
8dd0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
8de0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
8df0: 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
8e00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8e10: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
8e20: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
8e30: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
8e40: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
8e50: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
8e60: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
8e70: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
8e80: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  le);.    sqliteV
8e90: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
8ea0: 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a  ase+1, pTable->z
8eb0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
8ec0: 28 20 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  ( !pTable->isTem
8ed0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
8ee0: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
8ef0: 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , v);.    }.    
8f00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8f10: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
8f20: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  0);.    if( !isV
8f30: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
8f40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8f50: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62  OP_Destroy, pTab
8f60: 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65  le->tnum, pTable
8f70: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20  ->isTemp);.     
8f80: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65   for(pIdx=pTable
8f90: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
8fa0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
8fb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8fc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8fd0: 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e  _Destroy, pIdx->
8fe0: 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73  tnum, pTable->is
8ff0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Temp);.      }. 
9000: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
9010: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
9020: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
9030: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
9040: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
9050: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
9060: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  e..  **.  ** Exc
9070: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
9080: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
9090: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
90a0: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
90b0: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
90c0: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
90d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
90e0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
90f0: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
9100: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
9110: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20  db, pTable);.   
9120: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
9130: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
9140: 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  es;.  }.  sqlite
9150: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 29  ViewResetAll(db)
9160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9170: 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63  routine construc
9180: 74 73 20 61 20 50 33 20 73 74 72 69 6e 67 20 73  ts a P3 string s
9190: 75 69 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f  uitable for an O
91a0: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20  P_MakeIdxKey.** 
91b0: 6f 70 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20  opcode and adds 
91c0: 74 68 61 74 20 50 33 20 73 74 72 69 6e 67 20 74  that P3 string t
91d0: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
91e0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
91f0: 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  truction.** in t
9200: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
9210: 6e 65 2e 20 20 54 68 65 20 50 33 20 73 74 72 69  ne.  The P3 stri
9220: 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ng consists of a
9230: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
9240: 72 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f  r.** for each co
9250: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  lumn in the inde
9260: 78 20 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20  x pIdx of table 
9270: 70 54 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f  pTab.  If the co
9280: 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e  lumn uses.** a n
9290: 75 6d 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65  umeric sort orde
92a0: 72 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 73  r, then the P3 s
92b0: 74 72 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  tring character 
92c0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
92d0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  .** that column 
92e0: 69 73 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20  is 'n'.  If the 
92f0: 63 6f 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65  column uses a te
9300: 78 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74  xt sort order, t
9310: 68 65 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74  hen the.** P3 st
9320: 72 69 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65  ring is 't'.  Se
9330: 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78  e the OP_MakeIdx
9340: 4b 65 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d  Key opcode docum
9350: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  entation for.** 
9360: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
9370: 6d 61 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73  mation.  See als
9380: 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b  o the sqliteAddK
9390: 65 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65  eyType() routine
93a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
93b0: 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 56 64  AddIdxKeyType(Vd
93c0: 62 65 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49  be *v, Index *pI
93d0: 64 78 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79  dx){.  char *zTy
93e0: 70 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  pe;.  Table *pTa
93f0: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  b;.  int i, n;. 
9400: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
9410: 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
9420: 21 3d 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  !=0 );.  pTab = 
9430: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
9440: 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  n = pIdx->nColum
9450: 6e 3b 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  n;.  zType = sql
9460: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b  iteMallocRaw( n+
9470: 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65  1 );.  if( zType
9480: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9490: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
94a0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
94b0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
94c0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
94d0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
94e0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
94f0: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
9500: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72  Col[iCol].sortOr
9510: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
9520: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
9530: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
9540: 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74     zType[i] = 't
9550: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ';.    }else{.  
9560: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27      zType[i] = '
9570: 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n';.    }.  }.  
9580: 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zType[n] = 0;.  
9590: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
95a0: 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c  P3(v, -1, zType,
95b0: 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   n);.  sqliteFre
95c0: 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(zType);.}../*.
95d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
95e0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
95f0: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
9600: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
9610: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
9620: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9630: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
9640: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
9650: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
9660: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
9670: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
9680: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
9690: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
96a0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
96b0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
96c0: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
96d0: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
96e0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
96f0: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
9700: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
9710: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
9720: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
9730: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
9740: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
9750: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
9760: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
9770: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
9780: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
9790: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
97a0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
97b0: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
97c0: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
97d0: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
97e0: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
97f0: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
9800: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
9810: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9820: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
9830: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
9840: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9850: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
9860: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
9870: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
9880: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
9890: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
98a0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
98b0: 74 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62  til sqliteEndTab
98c0: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
98d0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
98e0: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
98f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
9900: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
9910: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65  ** to sqliteDefe
9920: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
9930: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
9940: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
9950: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
9960: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
9970: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9980: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9990: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
99a0: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20  st *pFromCol,   
99b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
99c0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
99d0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
99e0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
99f0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
9a00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
9a10: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64  er table */.  Id
9a20: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
9a30: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
9a40: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
9a50: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
9a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
9a70: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
9a80: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
9a90: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  .){.  Table *p =
9aa0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9ab0: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
9ac0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9ad0: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
9ae0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
9af0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
9b00: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
9b10: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
9b20: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
9b30: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
9b40: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
9b50: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
9b60: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
9b70: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
9b80: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
9b90: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31  & pToCol->nId!=1
9ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9bb0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
9bc0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f  se->zErrMsg, "fo
9bd0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20  reign key on ", 
9be0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  -1,.         p->
9bf0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9c00: 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
9c10: 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
9c20: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
9c30: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d  mn of table ", -
9c40: 31 2c 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d  1,.         pTo-
9c50: 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a  >z, pTo->n, 0);.
9c60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
9c70: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
9c80: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
9c90: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
9ca0: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
9cb0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d  && pToCol->nId!=
9cc0: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b  pFromCol->nId ){
9cd0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9ce0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9cf0: 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrMsg, .        
9d00: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
9d10: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
9d20: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
9d30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
9d40: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
9d50: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
9d60: 63 65 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a  ced table", 0);.
9d70: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9d80: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ++;.    goto fk_
9d90: 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
9da0: 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
9db0: 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42  l->nId;.  }.  nB
9dc0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
9dd0: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
9de0: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
9df0: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
9e00: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
9e10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9e20: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b  pToCol->nId; i++
9e30: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
9e40: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
9e50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
9e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
9e70: 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
9e80: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  oc( nByte );.  i
9e90: 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f  f( pFKey==0 ) go
9ea0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b  to fk_end;.  pFK
9eb0: 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
9ec0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
9ed0: 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
9ee0: 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
9ef0: 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
9f00: 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
9f10: 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
9f20: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
9f30: 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
9f40: 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
9f50: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
9f60: 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
9f70: 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
9f80: 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
9f90: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
9fa0: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
9fb0: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
9fc0: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
9fd0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
9fe0: 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
9ff0: 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
a000: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
a010: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
a020: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
a030: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
a040: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
a050: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
a060: 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
a070: 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
a080: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
a090: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
a0a0: 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
a0b0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
a0c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a0e0: 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
a0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
a100: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
a110: 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e  ErrMsg, "unknown
a120: 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20   column \"", .  
a130: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
a140: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c  ->a[i].zName, "\
a150: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
a160: 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29   definition", 0)
a170: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
a180: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
a190: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
a1a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a1b0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
a1c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a1d0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
a1e0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
a1f0: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
a200: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
a210: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
a220: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
a230: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
a240: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
a250: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
a260: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
a270: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
a280: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
a290: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
a2a0: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
a2b0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
a2c0: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
a2d0: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
a2e0: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
a2f0: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
a300: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
a310: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
a320: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
a330: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
a340: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
a350: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
a360: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
a370: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
a380: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c  ee(pFKey);.  sql
a390: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
a3a0: 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
a3b0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
a3c0: 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
a3d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a3e0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
a3f0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
a400: 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
a410: 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
a420: 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
a430: 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
a440: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
a450: 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
a460: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
a470: 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
a480: 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
a490: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
a4a0: 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
a4b0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
a4c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
a4d0: 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
a4e0: 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
a4f0: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
a500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66  /.void sqliteDef
a510: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
a520: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
a530: 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54  isDeferred){.  T
a540: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
a550: 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
a560: 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
a570: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
a580: 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
a590: 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
a5a0: 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
a5b0: 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
a5c0: 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erred;.}../*.** 
a5d0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
a5e0: 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
a5f0: 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20  ble.  pIndex is 
a600: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
a610: 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
a620: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
a630: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
a640: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
a650: 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
a660: 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
a670: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
a680: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
a690: 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
a6a0: 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
a6b0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
a6c0: 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
a6d0: 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
a6e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a6f0: 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
a700: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
a710: 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
a720: 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
a730: 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
a740: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
a750: 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
a760: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a770: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
a780: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
a790: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
a7a0: 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
a7b0: 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
a7c0: 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
a7d0: 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
a7e0: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
a7f0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
a800: 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
a810: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
a820: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a830: 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
a840: 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64   sqliteCreateInd
a850: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
a860: 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  rse,   /* All in
a870: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a880: 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
a890: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
a8a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
a8b0: 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e  index.  May be N
a8c0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
a8d0: 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d  pTable,   /* Nam
a8e0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
a8f0: 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50  o index.  Use pP
a900: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
a910: 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74  if 0 */.  IdList
a920: 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
a930: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
a940: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
a950: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
a960: 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
a970: 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
a980: 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
a990: 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
a9a0: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
a9b0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
a9c0: 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
a9d0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a9e0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
a9f0: 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  nd      /* The "
aa00: 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
aa10: 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
aa20: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
aa30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
aa40: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
aa50: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
aa60: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
aa70: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
aa80: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
aa90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
aaa0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
aab0: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
aac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
aad0: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
aae0: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
aaf0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
ab00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ab10: 68 69 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20  hideName = 0;   
ab20: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
ab30: 70 75 74 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  put table name i
ab40: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
ab50: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73   */..  if( pPars
ab60: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
ab70: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
ab80: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
ab90: 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
aba0: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
abb0: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
abc0: 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
abd0: 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
abe0: 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
abf0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
ac00: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
ac10: 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  !=0 );.    pTab 
ac20: 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72  =  sqliteTableFr
ac30: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  omToken(pParse, 
ac40: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
ac50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
ac60: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
ac70: 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
ac80: 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
ac90: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
aca0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
acb0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
acc0: 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
acd0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
ace0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
acf0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
ad00: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
ad10: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
ad20: 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20   " may not have 
ad30: 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64 64 65  new indices adde
ad40: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
ad50: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
ad60: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ad70: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
ad80: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
ad90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
ada0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
adb0: 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73 20  zErrMsg, "views 
adc0: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
add0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
ade0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
adf0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
ae00: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
ae10: 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
ae20: 20 69 73 20 63 72 65 61 74 65 64 20 77 68 69 6c   is created whil
ae30: 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65  e re-reading the
ae40: 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c   schema from sql
ae50: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
ae60: 62 75 74 20 74 68 65 20 74 61 62 6c 65 20 61 73  but the table as
ae70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ae80: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 74 65  is index is a te
ae90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 69  mporary table, i
aea0: 74 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  t can.  ** only 
aeb0: 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 74 61  mean that the ta
aec0: 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 6e  ble that this in
aed0: 64 65 78 20 69 73 20 72 65 61 6c 6c 79 20 61 73  dex is really as
aee0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 73  sociated with is
aef0: 0a 20 20 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20  .  ** one whose 
af00: 6e 61 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62  name is hidden b
af10: 65 68 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72  ehind a temporar
af20: 79 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  y table with the
af30: 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a   same name..  **
af40: 20 53 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65   Since its table
af50: 20 68 61 73 20 62 65 65 6e 20 73 75 70 70 72 65   has been suppre
af60: 73 73 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f  ssed, we need to
af70: 20 61 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74   also suppress t
af80: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20  he.  ** index.. 
af90: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
afa0: 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 21 70  ->initFlag && !p
afb0: 50 61 72 73 65 2d 3e 69 73 54 65 6d 70 20 26 26  Parse->isTemp &&
afc0: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b   pTab->isTemp ){
afd0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
afe0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
aff0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
b000: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b010: 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
b020: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
b030: 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
b040: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
b050: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
b060: 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
b070: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
b080: 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
b090: 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
b0a0: 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
b0b0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
b0c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
b0d0: 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
b0e0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
b0f0: 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
b100: 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
b110: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
b120: 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
b130: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
b140: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
b150: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
b160: 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
b170: 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
b180: 68 69 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77  his index, but w
b190: 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  e will not.  ** 
b1a0: 73 74 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69  store its name i
b1b0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
b1c0: 2e 20 20 53 65 74 20 74 68 65 20 68 69 64 65 4e  .  Set the hideN
b1d0: 61 6d 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f  ame flag to acco
b1e0: 6d 70 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73  mplish.  ** this
b1f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
b200: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
b210: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
b220: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
b230: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
b240: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
b250: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
b260: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
b270: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
b280: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
b290: 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
b2a0: 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
b2b0: 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
b2c0: 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
b2d0: 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e    Table *pTSameN
b2e0: 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62  ame;    /* A tab
b2f0: 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d  le with same nam
b300: 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a  e as the index *
b310: 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  /.    zName = sq
b320: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
b330: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
b340: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
b350: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
b360: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
b370: 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pISameName = 
b380: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
b390: 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29  db, zName))!=0 )
b3a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 53 61  {.      if( pISa
b3b0: 6d 65 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e  meName->pTable->
b3c0: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
b3d0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
b3e0: 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d        hideName =
b3f0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
b400: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
b410: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
b420: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65  ->zErrMsg, "inde
b430: 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20  x ", zName, .   
b440: 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64          " alread
b450: 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20  y exists", 0);. 
b460: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
b470: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
b480: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
b490: 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
b4a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54     }.    if( (pT
b4b0: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
b4c0: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
b4d0: 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Name))!=0 ){.   
b4e0: 20 20 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d     if( pTSameNam
b4f0: 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61  e->isTemp && pPa
b500: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
b510: 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d  .        hideNam
b520: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
b530: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b540: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
b550: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
b560: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
b570: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c  a table named ",
b580: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  .           zNam
b590: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  e, 0);.        p
b5a0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
b5b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
b5c0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
b5d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b5e0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
b5f0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
b600: 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
b610: 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
b620: 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
b630: 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
b640: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
b650: 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
b660: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c  intf(zBuf,"%d)",
b670: 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
b680: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
b690: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
b6a0: 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  (", pTab->zName,
b6b0: 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20   " autoindex ", 
b6c0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66  zBuf, 0);.    if
b6d0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
b6e0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b6f0: 64 65 78 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d  dex;.    hideNam
b700: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
b710: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d  dex(db, zName)!=
b720: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
b730: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
b740: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
b750: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
b760: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b770: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
b780: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
b790: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
b7a0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
b7b0: 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e  EMA_TABLE(pTab->
b7c0: 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a 20  isTemp), 0) ){. 
b7d0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
b7e0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
b7f0: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
b800: 54 45 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28 20  TE_INDEX;.  if( 
b810: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 20 69  pTab->isTemp ) i
b820: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
b830: 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 69  _TEMP_INDEX;.  i
b840: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
b850: 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
b860: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
b870: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
b880: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b890: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
b8a0: 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
b8b0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
b8c0: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
b8d0: 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
b8e0: 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
b8f0: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
b900: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
b910: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
b920: 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
b930: 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
b940: 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
b950: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
b960: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
b970: 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
b980: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
b990: 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
b9a0: 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
b9b0: 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
b9c0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49   pList = sqliteI
b9d0: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26  dListAppend(0, &
b9e0: 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
b9f0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
ba00: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
ba10: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
ba20: 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
ba30: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
ba40: 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
ba50: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
ba60: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
ba70: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
ba80: 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
baa0: 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e  eof(int)*pList->
bab0: 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  nId );.  if( pIn
bac0: 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
bad0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
bae0: 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
baf0: 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
bb00: 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78  dex[1];.  pIndex
bb10: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
bb20: 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  )&pIndex->aiColu
bb30: 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a  mn[pList->nId];.
bb40: 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
bb50: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
bb60: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
bb70: 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
bb80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
bb90: 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65  st->nId;.  pInde
bba0: 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
bbb0: 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20  dex->isUnique = 
bbc0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
bbd0: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
bbe0: 4e 61 6d 65 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  Name==0;..  /* S
bbf0: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
bc00: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
bc10: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
bc20: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
bc30: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
bc40: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
bc50: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
bc60: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
bc70: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
bc80: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
bc90: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
bca0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
bcb0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
bcc0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
bcd0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
bce0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
bcf0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
bd00: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
bd10: 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
bd20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bd30: 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
bd40: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
bd50: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
bd60: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
bd70: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
bd80: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68  me, .        " h
bd90: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
bda0: 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ed ", pList->a[i
bdb0: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
bdc0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
bdd0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
bde0: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
bdf0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
be00: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
be10: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
be20: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
be30: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
be40: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
be50: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
be60: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
be70: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
be80: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
be90: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
bea0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
beb0: 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65  ain && !hideName
bec0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
bed0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
bee0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
bef0: 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d  idxHash, pIndex-
bf00: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  >zName, strlen(z
bf10: 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
bf20: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
bf30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
bf40: 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
bf50: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
bf60: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
bf70: 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
bf80: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
bf90: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
bfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
bfb0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
bfc0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
bfd0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
bfe0: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
bff0: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
c000: 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
c010: 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
c020: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
c030: 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
c040: 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
c050: 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
c060: 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
c070: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
c080: 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  or the correct o
c090: 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41  peration of UPDA
c0a0: 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45  TE.  ** and INSE
c0b0: 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  RT..  */.  if( o
c0c0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
c0d0: 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
c0e0: 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ex==0.       || 
c0f0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
c100: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
c110: 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  e){.    pIndex->
c120: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
c130: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ndex;.    pTab->
c140: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
c150: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
c160: 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
c170: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
c180: 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
c190: 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
c1a0: 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
c1b0: 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
c1c0: 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
c1d0: 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
c1e0: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e  }.    pIndex->pN
c1f0: 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
c200: 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  ext;.    pOther-
c210: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
c220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
c230: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20  e initFlag is 1 
c240: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
c250: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
c260: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
c270: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62  lite_master" tab
c280: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20  le on the disk. 
c290: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
c2a0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a   to the disk.  *
c2b0: 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  * again.  Extrac
c2c0: 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62  t the table numb
c2d0: 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72  er from the pPar
c2e0: 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  se->newTnum fiel
c2f0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
c300: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
c310: 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  & pTable!=0 ){. 
c320: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
c330: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
c340: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
c350: 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  the initFlag is 
c360: 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
c370: 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
c380: 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
c390: 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
c3a0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
c3b0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
c3c0: 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
c3d0: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
c3e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
c3f0: 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
c400: 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c  .  ** The initFl
c410: 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  ag is 0 when the
c420: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
c430: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
c440: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
c450: 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69    The initFlag i
c460: 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
c470: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
c480: 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
c490: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
c4a0: 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
c4b0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
c4c0: 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
c4d0: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
c4e0: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
c4f0: 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
c500: 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
c510: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
c520: 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
c530: 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65  *.  ** If pTable
c540: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
c550: 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
c560: 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
c570: 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
c580: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
c590: 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
c5a0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
c5b0: 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
c5c0: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
c5d0: 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
c5e0: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
c5f0: 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
c600: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
c610: 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
c620: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
c630: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
c640: 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tFlag==0 ){.    
c650: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
c660: 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  *v;.    int lbl1
c670: 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20  , lbl2;.    int 
c680: 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  i;.    int addr;
c690: 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20  .    int isTemp 
c6a0: 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a  = pTab->isTemp;.
c6b0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47  .    v = sqliteG
c6c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c6d0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
c6e0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c6f0: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  index;.    if( p
c700: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
c710: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
c720: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
c730: 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  se, 0, isTemp);.
c740: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e        sqliteOpen
c750: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69  MasterTable(v, i
c760: 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sTemp);.    }.  
c770: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c780: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
c790: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c7a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c7b0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
c7c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c7d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
c7e0: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
c7f0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
c800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
c810: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
c820: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
c830: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64  geP3(v, -1, pInd
c840: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ex->zName, P3_ST
c850: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
c860: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c870: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
c880: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
c890: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
c8a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
c8b0: 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72 20  ATIC);.    addr 
c8c0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
c8d0: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
c8e0: 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  dex, 0, isTemp);
c8f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
c900: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
c910: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
c920: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
c930: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
c940: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
c950: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
c960: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c970: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
c980: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
c990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c9a0: 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c  Integer, isTemp,
c9b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c9c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c9d0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
c9e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
c9f0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
ca00: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
ca10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
ca20: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
ca30: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  ){.      n = Add
ca40: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
ca50: 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31  r(pStart->z) + 1
ca60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ca70: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
ca80: 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e  dr, pStart->z, n
ca90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
caa0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cab0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
cac0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cad0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cae0: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
caf0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
cb00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cb10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb20: 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c  Integer, isTemp,
cb30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
cb40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cb50: 5f 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54  _OpenRead, 2, pT
cb60: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20  ab->tnum);.     
cb70: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
cb80: 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
cb90: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
cba0: 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d  C);.      lbl2 =
cbb0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
cbc0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
cbd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cbe0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20  , OP_Rewind, 2, 
cbf0: 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c  lbl2);.      lbl
cc00: 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  1 = sqliteVdbeAd
cc10: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c  dOp(v, OP_Recno,
cc20: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   2, 0);.      fo
cc30: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
cc40: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
cc50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
cc60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
cc70: 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65 78 2d  lumn, 2, pIndex-
cc80: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20  >aiColumn[i]);. 
cc90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
cca0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ccb0: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70  OP_MakeIdxKey, p
ccc0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20  Index->nColumn, 
ccd0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  0);.      if( db
cce0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
ccf0: 20 29 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b   ) sqliteAddIdxK
cd00: 65 79 54 79 70 65 28 76 2c 20 70 49 6e 64 65 78  eyType(v, pIndex
cd10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
cd20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cd30: 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78  dxPut, 1, pIndex
cd40: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
cd50: 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ne);.      sqlit
cd60: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
cd70: 20 2d 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f   -1, "indexed co
cd80: 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
cd90: 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43  ique", P3_STATIC
cda0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
cdb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
cdc0: 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20  ext, 2, lbl1);. 
cdd0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
cde0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
cdf0: 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl2);.      sqli
ce00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ce10: 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a  P_Close, 2, 0);.
ce20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ce30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
ce40: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  e, 1, 0);.    }.
ce50: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
ce60: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
ce70: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
ce80: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
ce90: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
cea0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ceb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cec0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
ced0: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
cee0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
cef0: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
cf00: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
cf10: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
cf20: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
cf30: 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  ex:.  sqliteIdLi
cf40: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
cf50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
cf60: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
cf70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
cf80: 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
cf90: 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
cfa0: 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
cfb0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
cfc0: 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
cfd0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
cfe0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
cff0: 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
d000: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
d010: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
d020: 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  ndex;.  char *zN
d030: 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ame;.  Vdbe *v;.
d040: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
d050: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
d060: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
d070: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
d080: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
d090: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
d0a0: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
d0b0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
d0c0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
d0d0: 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  urn;.  pIndex = 
d0e0: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
d0f0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
d100: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
d110: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
d120: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
d130: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
d140: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
d150: 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c  uch index: ", 0,
d160: 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d   .        pName-
d170: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
d180: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
d190: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
d1a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
d1b0: 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
d1c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
d1d0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
d1e0: 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 61 73  rrMsg, "index as
d1f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
d200: 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
d210: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
d220: 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
d230: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
d240: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
d250: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
d260: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d270: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
d280: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
d290: 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
d2a0: 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
d2b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
d2c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
d2d0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
d2e0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
d2f0: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53 43 48  LITE_DELETE, SCH
d300: 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e  EMA_TABLE(pTab->
d310: 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a 20  isTemp), 0) ){. 
d320: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d330: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d   }.    if( pTab-
d340: 3e 69 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d  >isTemp ) code =
d350: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
d360: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
d370: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
d380: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
d390: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
d3a0: 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  ab->zName) ){.  
d3b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d3c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
d3d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
d3e0: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
d3f0: 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
d400: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
d410: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
d420: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
d430: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
d440: 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70  atic VdbeOp drop
d450: 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  Index[] = {.    
d460: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
d470: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
d480: 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
d490: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
d4a0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20         0}, /* 1 
d4b0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
d4c0: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
d4d0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
d4e0: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
d4f0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   1, 0,       0},
d500: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
d510: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
d520: 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 1,       0},.
d530: 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20        { OP_Eq,  
d540: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38         0, ADDR(8
d550: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
d560: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
d570: 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20   ADDR(3), 0},.  
d580: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
d590: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
d5a0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
d5b0: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
d5c0: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38  ,       0}, /* 8
d5d0: 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
d5e0: 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62  nt base;.    Tab
d5f0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
d600: 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20  x->pTable;..    
d610: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
d620: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
d630: 2c 20 30 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d  , 0, pTab->isTem
d640: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70  p);.    sqliteOp
d650: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
d660: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a   pTab->isTemp);.
d670: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
d680: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
d690: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
d6a0: 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65  Index), dropInde
d6b0: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  x);.    sqliteVd
d6c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
d6d0: 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+1, pIndex->zN
d6e0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
d6f0: 20 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29   !pTab->isTemp )
d700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
d710: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
d720: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
d730: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d740: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
d750: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d760: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
d770: 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  oy, pIndex->tnum
d780: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
d790: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
d7a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d7b0: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
d7c0: 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65  Delete the in-me
d7d0: 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e  mory description
d7e0: 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a   of this index..
d7f0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
d800: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
d810: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
d820: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
d830: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
d840: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
d850: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
d860: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
d870: 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
d880: 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
d890: 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
d8a0: 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
d8b0: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
d8c0: 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
d8d0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
d8e0: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
d8f0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
d900: 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41  t *sqliteIdListA
d910: 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c  ppend(IdList *pL
d920: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
d930: 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
d940: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
d950: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
d960: 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
d970: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d980: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d990: 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74    }.  if( (pList
d9a0: 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b  ->nId & 7)==0 ){
d9b0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
d9c0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
d9d0: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
d9e0: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69  c(pList->a, (pLi
d9f0: 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f  st->nId+8)*sizeo
da00: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
da10: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
da20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64  {.      sqliteId
da30: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
da40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
da50: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
da60: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
da70: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
da80: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30  a[pList->nId], 0
da90: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
daa0: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
dab0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  oken ){.    char
dac0: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
dad0: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e  a[pList->nId].zN
dae0: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  ame;.    sqliteS
daf0: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
db00: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
db10: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
db20: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
db30: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
db40: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
db50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
db60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
db70: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
db80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
db90: 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
dba0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
dbb0: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
dbc0: 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
dbd0: 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
dbe0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
dbf0: 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
dc00: 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
dc10: 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
dc20: 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
dc30: 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
dc40: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
dc50: 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
dc60: 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
dc70: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
dc80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
dc90: 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
dca0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
dcb0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
dcc0: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
dcd0: 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
dce0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
dcf0: 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
dd00: 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
dd10: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
dd20: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
dd30: 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
dd40: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
dd50: 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
dd60: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
dd70: 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
dd80: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
dd90: 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
dda0: 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
ddb0: 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
ddc0: 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
ddd0: 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
dde0: 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
ddf0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
de00: 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
de10: 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
de20: 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
de30: 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
de40: 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
de50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
de60: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
de70: 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
de80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
de90: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
dea0: 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
deb0: 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
dec0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
ded0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
dee0: 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
def0: 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
df00: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
df10: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41    sqliteSrcListA
df20: 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
df30: 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
df40: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
df50: 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
df60: 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
df70: 69 73 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69  ist *sqliteSrcLi
df80: 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74  stAppend(SrcList
df90: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
dfa0: 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70  pTable, Token *p
dfb0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28  Database){.  if(
dfc0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
dfd0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
dfe0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
dff0: 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
e000: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
e010: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
e020: 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 20 26 20   (pList->nSrc & 
e030: 37 29 3d 3d 31 20 29 7b 0a 20 20 20 20 53 72 63  7)==1 ){.    Src
e040: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
e050: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
e060: 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20  lloc(pList,.    
e070: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
e080: 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69  f(*pList) + (pLi
e090: 73 74 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65  st->nSrc+8)*size
e0a0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
e0b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
e0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
e0d0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
e0e0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
e0f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
e100: 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
e110: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
e120: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
e130: 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rc], 0, sizeof(p
e140: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
e150: 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
e160: 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
e170: 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
e180: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
e190: 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
e1a0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
e1b0: 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
e1c0: 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
e1d0: 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
e1e0: 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
e1f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
e200: 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  le ){.    char *
e210: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
e220: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61  pList->nSrc].zNa
e230: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
e240: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61  tNString(pz, pTa
e250: 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e  ble->z, pTable->
e260: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
e270: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
e280: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
e290: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
e2a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
e2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
e2c0: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
e2d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e2e0: 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
e2f0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
e300: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
e310: 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20  rc].zDatabase;. 
e320: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
e330: 69 6e 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73  ing(pz, pDatabas
e340: 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d  e->z, pDatabase-
e350: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
e360: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
e370: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
e380: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
e390: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
e3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e3b0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
e3c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
e3d0: 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65  st->nSrc++;.  re
e3e0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
e3f0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
e400: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
e410: 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
e420: 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
e430: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
e440: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 64 64 41  qliteSrcListAddA
e450: 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c  lias(SrcList *pL
e460: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
e470: 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
e480: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e   && pList->nSrc>
e490: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  0 ){.    int i =
e4a0: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31   pList->nSrc - 1
e4b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
e4c0: 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61  String(&pList->a
e4d0: 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b  [i].zAlias, pTok
e4e0: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
e4f0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e500: 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61  Dequote(pList->a
e510: 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  [i].zAlias);.  }
e520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
e530: 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
e540: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
e550: 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
e560: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
e570: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e580: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
e590: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
e5a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
e5b0: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
e5c0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
e5d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
e5e0: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
e5f0: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
e600: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e610: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
e620: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
e630: 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
e640: 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
e650: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
e660: 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78  qliteIdListIndex
e670: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
e680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
e690: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
e6a0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
e6b0: 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
e6c0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
e6d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
e6e0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
e6f0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
e700: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
e710: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
e720: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
e730: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
e740: 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
e750: 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
e760: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
e770: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44  d sqliteSrcListD
e780: 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
e790: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
e7a0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e7b0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
e7c0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
e7d0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
e7e0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
e7f0: 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
e800: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e810: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
e820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e830: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
e840: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
e850: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
e860: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
e870: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
e880: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e890: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
e8a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
e8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e8c0: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
e8d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
e8e0: 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  ct);.    sqliteE
e8f0: 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  xprDelete(pList-
e900: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
e910: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
e920: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
e930: 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
e940: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
e950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f  .}../*.** The CO
e960: 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f  PY command is fo
e970: 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  r compatibility 
e980: 77 69 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20  with PostgreSQL 
e990: 61 6e 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c  and specificiall
e9a0: 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69  y.** for the abi
e9b0: 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74 68 65  lity to read the
e9c0: 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75   output of pg_du
e9d0: 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20  mp.  The format 
e9e0: 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  is as.** follows
e9f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20  :.**.**    COPY 
ea00: 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20  table FROM file 
ea10: 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52  [USING DELIMITER
ea20: 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20  S string].**.** 
ea30: 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78  "table" is an ex
ea40: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d  isting table nam
ea50: 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64  e.  We will read
ea60: 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66   lines of code f
ea70: 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66  rom.** file to f
ea80: 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77  ill this table w
ea90: 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20  ith data.  File 
eaa0: 6d 69 67 68 74 20 62 65 20 22 73 74 64 69 6e 22  might be "stdin"
eab0: 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a  .  The optional.
eac0: 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72  ** delimiter str
ead0: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73 20 74  ing identifies t
eae0: 68 65 20 66 69 65 6c 64 20 73 65 70 61 72 61 74  he field separat
eaf0: 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ors.  The defaul
eb00: 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76  t is a tab..*/.v
eb10: 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a  oid sqliteCopy(.
eb20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
eb30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
eb40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
eb50: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
eb60: 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61  ame,   /* The na
eb70: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
eb80: 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77 69  into which we wi
eb90: 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54  ll insert */.  T
eba0: 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c  oken *pFilename,
ebb0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
ebc0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62  from which to ob
ebd0: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
ebe0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65   */.  Token *pDe
ebf0: 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73  limiter,   /* Us
ec00: 65 20 74 68 69 73 20 61 73 20 74 68 65 20 66 69  e this as the fi
ec10: 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f  eld delimiter */
ec20: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
ec30: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
ec40: 74 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74  to do if a const
ec50: 72 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29  raint fails */.)
ec60: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
ec70: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20  .  char *zTab;. 
ec80: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a   int i;.  Vdbe *
ec90: 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65  v;.  int addr, e
eca0: 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  nd;.  Index *pId
ecb0: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  x;.  char *zFile
ecc0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a   = 0;.  sqlite *
ecd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ece0: 0a 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  ...  zTab = sqli
ecf0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
ed00: 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29  oken(pTableName)
ed10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
ed20: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
ed30: 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63  zTab==0 ) goto c
ed40: 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70  opy_cleanup;.  p
ed50: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
ed60: 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61  eNameToTable(pPa
ed70: 72 73 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71  rse, zTab);.  sq
ed80: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
ed90: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
eda0: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
edb0: 70 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  p;.  zFile = sql
edc0: 69 74 65 53 74 72 4e 44 75 70 28 70 46 69 6c 65  iteStrNDup(pFile
edd0: 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61  name->z, pFilena
ede0: 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65  me->n);.  sqlite
edf0: 44 65 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a  Dequote(zFile);.
ee00: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
ee10: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
ee20: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 70 54 61  LITE_INSERT, pTa
ee30: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29  b->zName, zFile)
ee40: 0a 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  .      || sqlite
ee50: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
ee60: 2c 20 53 51 4c 49 54 45 5f 43 4f 50 59 2c 20 70  , SQLITE_COPY, p
ee70: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c  Tab->zName, zFil
ee80: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  e) ){.    goto c
ee90: 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  opy_cleanup;.  }
eea0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
eeb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
eec0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
eed0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
eee0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
eef0: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
ef00: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
ef10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ef20: 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30  P_FileOpen, 0, 0
ef30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
ef40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
ef50: 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c  r, pFilename->z,
ef60: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a   pFilename->n);.
ef70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
ef80: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
ef90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
efa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
efb0: 67 65 72 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d  ger, pTab->isTem
efc0: 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
efd0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
efe0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 70  _OpenWrite, 0, p
eff0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
f000: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
f010: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
f020: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
f030: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
f040: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f050: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f060: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
f070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f090: 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 73 54 65  eger, pTab->isTe
f0a0: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mp, 0);.      sq
f0b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f0c0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
f0d0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
f0e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
f0f0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
f100: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
f110: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
f120: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
f130: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
f140: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
f150: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f160: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
f170: 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
f180: 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a   the row count *
f190: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20  /.    }.    end 
f1a0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
f1b0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64  Label(v);.    ad
f1c0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
f1d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52  ddOp(v, OP_FileR
f1e0: 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ead, pTab->nCol,
f1f0: 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70   end);.    if( p
f200: 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20  Delimiter ){.   
f210: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
f220: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
f230: 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44  Delimiter->z, pD
f240: 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20  elimiter->n);.  
f250: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
f260: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
f270: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f280: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
f290: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22  ngeP3(v, addr, "
f2a0: 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  \t", 1);.    }. 
f2b0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b     if( pTab->iPK
f2c0: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ey>=0 ){.      s
f2d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f2e0: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
f2f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29   pTab->iPKey, 0)
f300: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
f310: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
f320: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
f330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f340: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f350: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
f360: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
f370: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
f380: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
f390: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
f3a0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
f3b0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
f3c0: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  r primary key co
f3d0: 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77  lumn is filled w
f3e0: 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69  ith NULL since i
f3f0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  ts.        ** va
f400: 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75  lue is always pu
f410: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  lled from the re
f420: 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  cord number */. 
f430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
f440: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
f450: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
f460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f470: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f480: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
f490: 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, i, 0);.      
f4a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
f4b0: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
f4c0: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
f4d0: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30  e, pTab, 0, 0, 0
f4e0: 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64  , 0, onError, ad
f4f0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  dr);.    sqliteC
f500: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
f510: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
f520: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
f530: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
f540: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
f550: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)!=0 ){.      s
f560: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f570: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
f580: 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  0);  /* Incremen
f590: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
f5a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
f5b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
f5c0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
f5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
f5e0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
f5f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
f600: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
f610: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
f620: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
f630: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
f640: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
f650: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
f660: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
f670: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f680: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30  OP_ColumnName, 0
f690: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f6a0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
f6b0: 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65  , -1, "rows inse
f6c0: 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43  rted", P3_STATIC
f6d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f6e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f6f0: 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a  allback, 1, 0);.
f700: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70      }.  }.  .cop
f710: 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  y_cleanup:.  sql
f720: 69 74 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a  iteFree(zFile);.
f730: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
f740: 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  ** The non-stand
f750: 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  ard VACUUM comma
f760: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c  nd is used to cl
f770: 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62  ean up the datab
f780: 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65  ase,.** collapse
f790: 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63   free space, etc
f7a0: 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65  .  It is modelle
f7b0: 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55  d after the VACU
f7c0: 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e  UM command.** in
f7d0: 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a   PostgreSQL..**.
f7e0: 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e  ** In version 1.
f7f0: 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74  0.x of SQLite, t
f800: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
f810: 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20  d would call.** 
f820: 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28  gdbm_reorganize(
f830: 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74  ) on all the dat
f840: 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42  abase tables.  B
f850: 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  ut beginning.** 
f860: 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69  with 2.0.0, SQLi
f870: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
f880: 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63  s GDBM so this c
f890: 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65  ommand has.** be
f8a0: 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  come a no-op..*/
f8b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75  .void sqliteVacu
f8c0: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
f8d0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e  , Token *pTableN
f8e0: 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ame){.  /* Do no
f8f0: 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
f900: 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
f910: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
f920: 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63  liteBeginTransac
f930: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
f940: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
f950: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
f960: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
f970: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
f980: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
f990: 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
f9a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
f9b0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
f9c0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
f9d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
f9e0: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
f9f0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
fa00: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
fa10: 47 49 4e 22 2c 20 30 29 20 29 20 72 65 74 75 72  GIN", 0) ) retur
fa20: 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  n;.  if( db->fla
fa30: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
fa40: 61 6e 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ans ){.    pPars
fa50: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73  e->nErr++;.    s
fa60: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
fa70: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
fa80: 20 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61   "cannot start a
fa90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 0a 20   transaction ". 
faa0: 20 20 20 20 20 20 22 77 69 74 68 69 6e 20 61 20        "within a 
fab0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 30 29  transaction", 0)
fac0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
fad0: 7d 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57  }.  sqliteBeginW
fae0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
faf0: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 64  arse, 0, 0);.  d
fb00: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
fb10: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62  TE_InTrans;.  db
fb20: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
fb30: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ror;.}../*.** Co
fb40: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
fb50: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
fb60: 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  eCommitTransacti
fb70: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
fb80: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
fb90: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
fba0: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
fbb0: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
fbc0: 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
fbd0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
fbe0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
fbf0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
fc00: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
fc10: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
fc20: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
fc30: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
fc40: 4f 4d 4d 49 54 22 2c 20 30 29 20 29 20 72 65 74  OMMIT", 0) ) ret
fc50: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
fc60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
fc70: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
fc80: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
fc90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
fca0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
fcb0: 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20  ErrMsg, .       
fcc0: 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d  "cannot commit -
fcd0: 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
fce0: 69 73 20 61 63 74 69 76 65 22 2c 20 30 29 3b 0a  is active", 0);.
fcf0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fd00: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
fd10: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
fd20: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
fd30: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
fd40: 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  );.  db->onError
fd50: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d   = OE_Default;.}
fd60: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
fd70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
fd80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c  /.void sqliteRol
fd90: 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
fda0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
fdb0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
fdc0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
fdd0: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
fde0: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
fdf0: 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
fe00: 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
fe10: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
fe20: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
fe30: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
fe40: 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
fe50: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
fe60: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
fe70: 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
fe80: 22 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  ", 0) ) return;.
fe90: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
fea0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
feb0: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  s)==0 ){.    pPa
fec0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
fed0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
fee0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
fef0: 67 2c 0a 20 20 20 20 20 20 20 22 63 61 6e 6e 6f  g,.       "canno
ff00: 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20  t rollback - no 
ff10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
ff20: 63 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20  ctive", 0);.    
ff30: 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76  return; .  }.  v
ff40: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
ff50: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
ff60: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  v ){.    sqliteV
ff70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
ff80: 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a  ollback, 0, 0);.
ff90: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
ffa0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
ffb0: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
ffc0: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
ffd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
ffe0: 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
fff0: 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
10000 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66   schema cookie f
10010 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20  or all.** named 
10020 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
10030 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
10040 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
10050 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
10060 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
10070 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10080 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  b;.  Vdbe *v = s
10090 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
100a0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rse);.  for(i=0;
100b0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
100c0 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 31 20 7c  {.    if( i==1 |
100d0 7c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  | db->aDb[i].pBt
100e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
100f0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10100 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
10110 43 6f 6f 6b 69 65 2c 20 30 2c 20 64 62 2d 3e 61  Cookie, 0, db->a
10120 44 62 5b 69 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[i].schema_coo
10130 6b 69 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72  kie);.  }.  pPar
10140 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
10150 65 64 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 1;.}../*.**
10160 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
10170 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
10180 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
10190 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
101a0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
101b0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
101c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
101d0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
101e0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
101f0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
10200 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
10210 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
10220 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
10230 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
10240 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
10250 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
10260 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74  he setCheckpoint
10270 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
10280 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
10290 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
102a0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
102b0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
102c0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
102d0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
102e0 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
102f0 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
10300 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
10310 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
10320 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
10330 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
10340 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
10350 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
10360 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
10370 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
10380 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
10390 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
103a0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
103b0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
103c0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
103d0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
103e0 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
103f0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
10400 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  et..**.** The te
10410 6d 70 4f 6e 6c 79 20 66 6c 61 67 20 69 6e 64 69  mpOnly flag indi
10420 63 61 74 65 73 20 74 68 61 74 20 6f 6e 6c 79 20  cates that only 
10430 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
10440 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
10450 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 69 73 20  .** during this 
10460 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  write operation.
10470 20 20 54 68 65 20 70 72 69 6d 61 72 79 20 64 61    The primary da
10480 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
10490 6e 6f 74 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f 63  not.** write-loc
104a0 6b 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 20 74  ked.  Only the t
104b0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
104c0 65 20 66 69 6c 65 20 67 65 74 73 20 61 20 77 72  e file gets a wr
104d0 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74 68  ite lock..** Oth
104e0 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
104f0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 61   continue to rea
10500 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 70  d or write the p
10510 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 20  rimary database 
10520 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
10530 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
10540 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
10550 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68  Parse, int setCh
10560 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 74 65  eckpoint, int te
10570 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56 64 62 65 20  mpOnly){.  Vdbe 
10580 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
10590 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
105a0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
105b0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
105c0 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20  se->trigStack ) 
105d0 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68  return; /* if th
105e0 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67  is is in a trigg
105f0 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61  er */.  if( (pPa
10600 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
10610 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
10620 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
10630 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10640 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31 2c  _Transaction, 1,
10650 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 74 65   0);.    if( !te
10660 6d 70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  mpOnly ){.      
10670 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10680 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
10690 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
106a0 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79  sqliteCodeVerify
106b0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 3b 0a  Schema(pParse);.
106c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
106d0 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  ( setCheckpoint 
106e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
106f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65  eAddOp(v, OP_Che
10700 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a  ckpoint, 0, 0);.
10710 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10720 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  dOp(v, OP_Checkp
10730 6f 69 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  oint, 1, 0);.  }
10740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
10750 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
10760 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
10770 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
10780 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
10790 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
107a0 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20   is a companion 
107b0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69  function to Begi
107c0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
107d0 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  )..** If a trans
107e0 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
107f0 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ed, then commit 
10800 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70  it.  If a checkp
10810 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72  oint was.** star
10820 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ted then commit 
10830 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  that..*/.void sq
10840 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
10850 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
10860 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
10870 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74  .  if( pParse->t
10880 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72  rigStack ) retur
10890 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73  n; /* if this is
108a0 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f   in a trigger */
108b0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
108c0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
108d0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
108e0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
108f0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10900 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
10910 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67     /* Do Nothing
10920 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
10930 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10940 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
10950 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , 0);.  }.}.../*
10960 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
10970 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
10980 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
10990 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
109a0 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72   getBoolean(char
109b0 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *z){.  static c
109c0 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20  har *azTrue[] = 
109d0 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22  { "yes", "on", "
109e0 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69  true" };.  int i
109f0 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20  ;.  if( z[0]==0 
10a00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10a10 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20  ( isdigit(z[0]) 
10a20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  || (z[0]=='-' &&
10a30 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20   isdigit(z[1])) 
10a40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74  ){.    return at
10a50 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  oi(z);.  }.  for
10a60 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
10a70 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a  zTrue)/sizeof(az
10a80 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  True[0]); i++){.
10a90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
10aa0 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69  rICmp(z,azTrue[i
10ab0 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
10ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
10ae0 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20 73  pret the given s
10af0 74 72 69 6e 67 20 61 73 20 61 20 73 61 66 65 74  tring as a safet
10b00 79 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  y level.  Return
10b10 20 30 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31   0 for OFF,.** 1
10b20 20 66 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41   for ON or NORMA
10b30 4c 20 61 6e 64 20 32 20 66 6f 72 20 46 55 4c 4c  L and 2 for FULL
10b40 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
10b50 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74  t the values ret
10b60 75 72 6e 65 64 20 61 72 65 20 6f 6e 65 20 6c 65  urned are one le
10b70 73 73 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ss that the valu
10b80 65 73 20 74 68 61 74 0a 2a 2a 20 73 68 6f 75 6c  es that.** shoul
10b90 64 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  d be passed into
10ba0 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 53   sqliteBtreeSetS
10bb0 61 66 65 74 79 4c 65 76 65 6c 28 29 2e 20 20 54  afetyLevel().  T
10bc0 68 65 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f  he is done.** to
10bd0 20 73 75 70 70 6f 72 74 20 6c 65 67 61 63 79 20   support legacy 
10be0 53 51 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 73  SQL code.  The s
10bf0 61 66 65 74 79 20 6c 65 76 65 6c 20 75 73 65 64  afety level used
10c00 20 74 6f 20 62 65 20 62 6f 6f 6c 65 61 6e 0a 2a   to be boolean.*
10c10 2a 20 61 6e 64 20 6f 6c 64 65 72 20 73 63 72 69  * and older scri
10c20 70 74 73 20 6d 61 79 20 68 61 76 65 20 75 73 65  pts may have use
10c30 64 20 6e 75 6d 62 65 72 73 20 30 20 66 6f 72 20  d numbers 0 for 
10c40 4f 46 46 20 61 6e 64 20 31 20 66 6f 72 20 4f 4e  OFF and 1 for ON
10c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10c60 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 63  getSafetyLevel(c
10c70 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69  har *z){.  stati
10c80 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
10c90 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10ca0 2a 7a 57 6f 72 64 3b 0a 20 20 20 20 69 6e 74 20  *zWord;.    int 
10cb0 76 61 6c 3b 0a 20 20 7d 20 61 4b 65 79 5b 5d 20  val;.  } aKey[] 
10cc0 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 6f 22 2c 20  = {.    { "no", 
10cd0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6f     0 },.    { "o
10ce0 66 66 22 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  ff",   0 },.    
10cf0 7b 20 22 66 61 6c 73 65 22 2c 20 30 20 7d 2c 0a  { "false", 0 },.
10d00 20 20 20 20 7b 20 22 79 65 73 22 2c 20 20 20 31      { "yes",   1
10d10 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6e 22 2c 20   },.    { "on", 
10d20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 74     1 },.    { "t
10d30 72 75 65 22 2c 20 20 31 20 7d 2c 0a 20 20 20 20  rue",  1 },.    
10d40 7b 20 22 66 75 6c 6c 22 2c 20 20 32 20 7d 2c 0a  { "full",  2 },.
10d50 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
10d60 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
10d70 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 73  turn 1;.  if( is
10d80 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
10d90 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
10da0 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
10db0 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
10dc0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
10dd0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4b 65 79 29  ; i<sizeof(aKey)
10de0 2f 73 69 7a 65 6f 66 28 61 4b 65 79 5b 30 5d 29  /sizeof(aKey[0])
10df0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10e00 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
10e10 61 4b 65 79 5b 69 5d 2e 7a 57 6f 72 64 29 3d 3d  aKey[i].zWord)==
10e20 30 20 29 20 72 65 74 75 72 6e 20 61 4b 65 79 5b  0 ) return aKey[
10e30 69 5d 2e 76 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  i].val;.  }.  re
10e40 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
10e50 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d   Process a pragm
10e60 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  a statement.  .*
10e70 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65  *.** Pragmas are
10e80 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a   of this form:.*
10e90 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41  *.**      PRAGMA
10ea0 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a   id = value.**.*
10eb0 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72  * The identifier
10ec0 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
10ed0 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61   string.  The va
10ee0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c  lue is a string,
10ef0 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69   and.** identifi
10f00 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e  er, or a number.
10f10 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69    If minusFlag i
10f20 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
10f30 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e   value is.** a n
10f40 75 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70  umber that was p
10f50 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e  receded by a min
10f60 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64  us sign..*/.void
10f70 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28 50 61   sqlitePragma(Pa
10f80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
10f90 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
10fa0 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6d 69   *pRight, int mi
10fb0 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68 61 72  nusFlag){.  char
10fc0 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63   *zLeft = 0;.  c
10fd0 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b  har *zRight = 0;
10fe0 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
10ff0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
11000 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
11010 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11020 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
11030 72 6e 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73  rn;..  zLeft = s
11040 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65  qliteStrNDup(pLe
11050 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29  ft->z, pLeft->n)
11060 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  ;.  sqliteDequot
11070 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  e(zLeft);.  if( 
11080 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
11090 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20   zRight = 0;.   
110a0 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
110b0 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20  g(&zRight, "-", 
110c0 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52  1, pRight->z, pR
110d0 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  ight->n, 0);.  }
110e0 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74  else{.    zRight
110f0 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
11100 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67  (pRight->z, pRig
11110 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ht->n);.    sqli
11120 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74  teDequote(zRight
11130 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
11140 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
11150 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47  rse, SQLITE_PRAG
11160 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68  MA, zLeft, zRigh
11170 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
11180 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20  Free(zLeft);.   
11190 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67   sqliteFree(zRig
111a0 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ht);.    return;
111b0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a  .  }. .  /*.  **
111c0 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
111d0 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  _cache_size.  **
111e0 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
111f0 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20  _cache_size=N.  
11200 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
11210 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
11220 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69  he current persi
11230 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  stent setting fo
11240 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
11250 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65  cache size.  The
11260 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
11270 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
11280 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
11290 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
112a0 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
112b0 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74  nd form sets bot
112c0 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  h the current.  
112d0 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
112e0 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  ze value and the
112f0 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65   persistent page
11300 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
11310 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
11320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11330 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
11340 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
11350 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69  size is stored i
11360 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f  n meta-value 2 o
11370 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a  f page 1 of the.
11380 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
11390 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65 20 73  le.  The cache s
113a0 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ize is actually 
113b0 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
113c0 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  ue of.  ** this 
113d0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
113e0 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65    The sign of me
113f0 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72  ta-value 2 deter
11400 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  mines the.  ** s
11410 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
11420 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  ng.  A negative 
11430 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63  value means sync
11440 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20  hronous is off. 
11450 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69   ** and a positi
11460 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73  ve value means s
11470 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
11480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
11490 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
114a0 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  ,"default_cache_
114b0 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
114c0 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
114d0 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
114e0 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  {.      { OP_Rea
114f0 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
11500 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
11510 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20   { OP_AbsValue, 
11520 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
11530 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
11540 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  up,         0, 0
11550 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
11560 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
11570 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
11580 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11590 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Ne,          0,
115a0 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   6,        0},. 
115b0 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
115c0 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53  r,     MAX_PAGES
115d0 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ,0, 0},.      { 
115e0 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
115f0 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63 61  0, 0,        "ca
11600 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20  che_size"},.    
11610 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
11620 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
11630 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
11640 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70  if( pRight->z==p
11650 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  Left->z ){.     
11660 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11670 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
11680 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c  e(getCacheSize),
11690 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a   getCacheSize);.
116a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
116b0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
116c0 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69   int size = atoi
116d0 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
116e0 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
116f0 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
11700 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
11710 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
11720 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
11730 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11740 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73  v, OP_Integer, s
11750 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ize, 0);.      s
11760 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11770 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
11780 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 61 64   0, 2);.      ad
11790 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
117a0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
117b0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  er, 0, 0);.     
117c0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
117d0 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64  (v, OP_Ge, 0, ad
117e0 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
117f0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11800 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20  OP_Negative, 0, 
11810 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11820 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11830 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29  SetCookie, 0, 2)
11840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e  ;.      sqliteEn
11850 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
11860 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64  pParse);.      d
11870 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
11880 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30  db->cache_size<0
11890 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b   ? -size : size;
118a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
118b0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64  eeSetCacheSize(d
118c0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64  b->aDb[0].pBt, d
118d0 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
118e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
118f0 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
11900 20 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a   cache_size.  **
11910 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
11920 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
11930 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
11940 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
11950 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67  nt local setting
11960 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61   for the.  ** pa
11970 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20  ge cache size.  
11980 54 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  The local settin
11990 67 20 63 61 6e 20 62 65 20 64 69 66 66 65 72 65  g can be differe
119a0 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  nt from.  ** the
119b0 20 70 65 72 73 69 73 74 65 6e 74 20 63 61 63 68   persistent cach
119c0 65 20 73 69 7a 65 20 76 61 6c 75 65 20 74 68 61  e size value tha
119d0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  t is stored in t
119e0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
119f0 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 20 54   file itself.  T
11a00 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
11a10 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  d is the maximum
11a20 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
11a30 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
11a40 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65  e cache.  The se
11a50 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
11a60 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
11a70 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
11a80 6c 75 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  lue.  It does no
11a90 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 65 72  t change the per
11aa0 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61 63  sistent.  ** cac
11ab0 68 65 20 73 69 7a 65 20 73 74 6f 72 65 64 20 6f  he size stored o
11ac0 6e 20 74 68 65 20 64 69 73 6b 20 73 6f 20 74 68  n the disk so th
11ad0 65 20 63 61 63 68 65 20 73 69 7a 65 20 77 69 6c  e cache size wil
11ae0 6c 20 72 65 76 65 72 74 0a 20 20 2a 2a 20 74 6f  l revert.  ** to
11af0 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c   its default val
11b00 75 65 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ue when the data
11b10 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 20 61  base is closed a
11b20 6e 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20 2a  nd reopened..  *
11b30 2a 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 61 20  * N should be a 
11b40 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
11b50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
11b60 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11b70 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d  ,"cache_size")==
11b80 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
11b90 56 64 62 65 4f 70 20 67 65 74 43 61 63 68 65 53  VdbeOp getCacheS
11ba0 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
11bb0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
11bc0 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
11bd0 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20  cache_size"},.  
11be0 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
11bf0 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
11c00 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
11c10 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
11c20 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
11c30 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62     int size = db
11c40 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20  ->cache_size;;. 
11c50 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
11c60 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
11c70 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11c80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
11c90 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20  ger, size, 0);. 
11ca0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11cb0 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
11cc0 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
11cd0 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
11ce0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
11cf0 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
11d00 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  atoi(zRight);.  
11d10 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
11d20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
11d30 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61 63       if( db->cac
11d40 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  he_size<0 ) size
11d50 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
11d60 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  db->cache_size =
11d70 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
11d80 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
11d90 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
11da0 70 42 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBt, db->cache_s
11db0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
11dc0 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
11dd0 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73  PRAGMA default_s
11de0 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20  ynchronous.  ** 
11df0 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f   PRAGMA default_
11e00 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 4e 7c 4f  synchronous=ON|O
11e10 46 46 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20  FF|NORMAL|FULL. 
11e20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
11e30 73 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73 20  st form returns 
11e40 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 76  the persistent v
11e50 61 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79 6e  alue of the "syn
11e60 63 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e  chronous" settin
11e70 67 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73  g.  ** that is s
11e80 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
11e90 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
11ea0 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  the synchronous 
11eb0 73 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20 2a  setting that.  *
11ec0 2a 20 69 73 20 75 73 65 64 20 77 68 65 6e 65 76  * is used whenev
11ed0 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
11ee0 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73  is opened unless
11ef0 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
11f00 20 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20 22   separate.  ** "
11f10 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72 61  synchronous" pra
11f20 67 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  gma.  The second
11f30 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68   form changes th
11f40 65 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e 64  e persistent and
11f50 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20   the.  ** local 
11f60 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74  synchronous sett
11f70 69 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ing to the value
11f80 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a   given..  **.  *
11f90 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  * If synchronous
11fa0 20 69 73 20 4f 46 46 2c 20 53 51 4c 69 74 65 20   is OFF, SQLite 
11fb0 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
11fc0 20 61 6e 79 20 66 73 79 6e 63 28 29 20 73 79 73   any fsync() sys
11fd0 74 65 6d 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  tems calls.  ** 
11fe0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 64 61 74  to make sure dat
11ff0 61 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 74  a is committed t
12000 6f 20 64 69 73 6b 2e 20 20 57 72 69 74 65 20 6f  o disk.  Write o
12010 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 76 65  perations are ve
12020 72 79 20 66 61 73 74 2c 0a 20 20 2a 2a 20 62 75  ry fast,.  ** bu
12030 74 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  t a power failur
12040 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20  e can leave the 
12050 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20 69  database in an i
12060 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
12070 65 2e 0a 20 20 2a 2a 20 49 66 20 73 79 6e 63 68  e..  ** If synch
12080 72 6f 6e 6f 75 73 20 69 73 20 4f 4e 20 6f 72 20  ronous is ON or 
12090 4e 4f 52 4d 41 4c 2c 20 53 51 4c 69 74 65 20 77  NORMAL, SQLite w
120a0 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63 28  ill do an fsync(
120b0 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  ) system call to
120c0 0a 20 20 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  .  ** make sure 
120d0 64 61 74 61 20 69 73 20 62 65 69 6e 67 20 77 72  data is being wr
120e0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
120f0 54 68 65 20 72 69 73 6b 20 6f 66 20 63 6f 72 72  The risk of corr
12100 75 70 74 69 6f 6e 20 64 75 65 20 74 6f 0a 20 20  uption due to.  
12110 2a 2a 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  ** a power loss 
12120 69 6e 20 74 68 69 73 20 6d 6f 64 65 20 69 73 20  in this mode is 
12130 6e 65 67 6c 69 67 69 62 6c 65 20 62 75 74 20 6e  negligible but n
12140 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 73 79 6e  on-zero.  If syn
12150 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73  chronous.  ** is
12160 20 46 55 4c 4c 2c 20 65 78 74 72 61 20 66 73 79   FULL, extra fsy
12170 6e 63 28 29 73 20 6f 63 63 75 72 20 74 6f 20 72  nc()s occur to r
12180 65 64 75 63 65 20 74 68 65 20 72 69 73 6b 20 6f  educe the risk o
12190 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 74 6f 20  f corruption to 
121a0 6e 65 61 72 0a 20 20 2a 2a 20 7a 65 72 6f 2c 20  near.  ** zero, 
121b0 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
121c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 65 6e   performance pen
121d0 61 6c 74 79 2e 20 20 54 68 65 20 64 65 66 61 75  alty.  The defau
121e0 6c 74 20 6d 6f 64 65 20 69 73 20 4e 4f 52 4d 41  lt mode is NORMA
121f0 4c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  L..  */.  if( sq
12200 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
12210 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  t,"default_synch
12220 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20  ronous")==0 ){. 
12230 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
12240 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20   getSync[] = {. 
12250 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
12260 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
12270 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
12280 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  "},.      { OP_R
12290 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 33  eadCookie,  0, 3
122a0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
122b0 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20     { OP_Dup,    
122c0 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
122d0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
122e0 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _If,          0,
122f0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
12300 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
12310 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
12320 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
12330 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
12340 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
12350 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
12360 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20  { OP_Lt,        
12370 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30    0, 5,        0
12380 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64  },.      { OP_Ad
12390 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c  dImm,      1, 0,
123a0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
123b0 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
123c0 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
123d0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
123e0 48 61 6c 74 2c 20 20 20 20 20 20 20 20 30 2c 20  Halt,        0, 
123f0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
12400 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c      { OP_AddImm,
12410 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 20 20       -1, 0,     
12420 20 20 20 30 7d 2c 20 20 2f 2a 20 31 30 20 2a 2f     0},  /* 10 */
12430 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
12440 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
12450 20 20 20 20 20 20 30 7d 0a 20 20 20 20 7d 3b 0a        0}.    };.
12460 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
12470 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
12480 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
12490 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
124a0 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
124b0 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79  (getSync), getSy
124c0 6e 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nc);.      sqlit
124d0 65 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  eVdbeChangeP2(v,
124e0 20 61 64 64 72 2b 33 2c 20 61 64 64 72 2b 31 30   addr+3, addr+10
124f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12500 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
12510 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
12520 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20  b->cache_size;. 
12530 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
12540 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
12550 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
12560 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
12570 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
12580 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12590 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43  ddOp(v, OP_ReadC
125a0 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20  ookie, 0, 2);.  
125b0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
125c0 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
125d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
125e0 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
125f0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
12600 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
12610 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12620 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 61 64 64 72  , OP_Ne, 0, addr
12630 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
12640 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12650 5f 41 64 64 49 6d 6d 2c 20 4d 41 58 5f 50 41 47  _AddImm, MAX_PAG
12660 45 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ES, 0);.      sq
12670 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12680 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c   OP_AbsValue, 0,
12690 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 73   0);.      db->s
126a0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65  afety_level = ge
126b0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69  tSafetyLevel(zRi
126c0 67 68 74 29 2b 31 3b 0a 20 20 20 20 20 20 69 66  ght)+1;.      if
126d0 28 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  ( db->safety_lev
126e0 65 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  el==1 ){.       
126f0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12700 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c  (v, OP_Negative,
12710 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
12720 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
12730 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12740 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12750 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
12760 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
12770 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12780 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73 61 66  Integer, db->saf
12790 65 74 79 5f 6c 65 76 65 6c 2c 20 30 29 3b 0a 20  ety_level, 0);. 
127a0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
127b0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
127c0 6f 6b 69 65 2c 20 30 2c 20 33 29 3b 0a 20 20 20  okie, 0, 3);.   
127d0 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
127e0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
127f0 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61  e);.      db->ca
12800 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
12810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
12820 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64  eeSetCacheSize(d
12830 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64  b->aDb[0].pBt, d
12840 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
12850 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
12860 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
12870 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
12880 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  db->safety_level
12890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
128a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
128b0 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
128c0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
128d0 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f  ynchronous=OFF|O
128e0 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20  N|NORMAL|FULL.  
128f0 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
12900 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
12910 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e  value of the syn
12920 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20  chronous flag.  
12930 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
12940 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
12950 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
12960 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
12970 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a  file and the.  *
12980 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * default value 
12990 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
129a0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
129b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20  he database is. 
129c0 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f   ** opened..  */
129d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
129e0 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63  ICmp(zLeft,"sync
129f0 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a  hronous")==0 ){.
12a00 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
12a10 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a  p getSync[] = {.
12a20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
12a30 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
12a40 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75       "synchronou
12a50 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  s"},.      { OP_
12a60 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
12a70 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
12a80 20 20 7d 3b 0a 20 20 20 20 69 66 28 20 70 52 69    };.    if( pRi
12a90 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
12aa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12ab0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12ac0 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73 61 66  Integer, db->saf
12ad0 65 74 79 5f 6c 65 76 65 6c 2d 31 2c 20 30 29 3b  ety_level-1, 0);
12ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12af0 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
12b00 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29  raySize(getSync)
12b10 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20  , getSync);.    
12b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
12b30 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68   size = db->cach
12b40 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  e_size;.      if
12b50 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  ( size<0 ) size 
12b60 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64  = -size;.      d
12b70 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
12b80 3d 20 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c  = getSafetyLevel
12b90 28 7a 52 69 67 68 74 29 2b 31 3b 0a 20 20 20 20  (zRight)+1;.    
12ba0 20 20 69 66 28 20 64 62 2d 3e 73 61 66 65 74 79    if( db->safety
12bb0 5f 6c 65 76 65 6c 3d 3d 31 20 29 20 73 69 7a 65  _level==1 ) size
12bc0 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
12bd0 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  db->cache_size =
12be0 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
12bf0 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65  iteBtreeSetCache
12c00 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
12c10 70 42 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBt, db->cache_s
12c20 69 7a 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ize);.      sqli
12c30 74 65 42 74 72 65 65 53 65 74 53 61 66 65 74 79  teBtreeSetSafety
12c40 4c 65 76 65 6c 28 64 62 2d 3e 61 44 62 5b 30 5d  Level(db->aDb[0]
12c50 2e 70 42 74 2c 20 64 62 2d 3e 73 61 66 65 74 79  .pBt, db->safety
12c60 5f 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  _level);.    }. 
12c70 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
12c80 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
12c90 74 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72  t, "trigger_over
12ca0 68 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20 29  head_test")==0 )
12cb0 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
12cc0 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
12cd0 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64        always_cod
12ce0 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20  e_trigger_setup 
12cf0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
12d00 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64        always_cod
12d10 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20  e_trigger_setup 
12d20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
12d30 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
12d40 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
12d50 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30 20  vdbe_trace")==0 
12d60 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
12d70 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
12d80 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
12d90 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65 54   |= SQLITE_VdbeT
12da0 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  race;.    }else{
12db0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
12dc0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62 65   &= ~SQLITE_Vdbe
12dd0 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  Trace;.    }.  }
12de0 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
12df0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
12e00 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61   "full_column_na
12e10 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mes")==0 ){.    
12e20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
12e30 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
12e40 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
12e50 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
12e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12e70 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
12e80 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
12e90 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ames;.    }.  }e
12ea0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
12eb0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
12ec0 22 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73 22  "show_datatypes"
12ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
12ee0 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
12ef0 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
12f00 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12f10 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20  ReportTypes;.   
12f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
12f30 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
12f40 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a  TE_ReportTypes;.
12f50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
12f60 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
12f70 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c  mp(zLeft, "resul
12f80 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d  t_set_details")=
12f90 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
12fa0 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
12fb0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
12fc0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65  ags |= SQLITE_Re
12fd0 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
12fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
12ff0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
13000 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73  TE_ResultDetails
13010 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
13020 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
13030 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75  ICmp(zLeft, "cou
13040 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20  nt_changes")==0 
13050 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
13060 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
13070 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
13080 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74   |= SQLITE_Count
13090 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Rows;.    }else{
130a0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
130b0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e   &= ~SQLITE_Coun
130c0 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  tRows;.    }.  }
130d0 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
130e0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
130f0 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63   "empty_result_c
13100 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b  allbacks")==0 ){
13110 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
13120 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
13130 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
13140 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c  = SQLITE_NullCal
13150 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  lback;.    }else
13160 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
13170 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c  s &= ~SQLITE_Nul
13180 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  lCallback;.    }
13190 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
131a0 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
131b0 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f  eft, "table_info
131c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  ")==0 ){.    Tab
131d0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54  le *pTab;.    pT
131e0 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
131f0 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29  able(db, zRight)
13200 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
13210 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56  {.      static V
13220 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50  dbeOp tableInfoP
13230 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20  reface[] = {.   
13240 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
13250 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
13260 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
13270 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
13280 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
13290 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
132a0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
132b0 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
132c0 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20  "type"},.       
132d0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
132e0 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  3, 0,       "
132f0 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20  notnull"},.     
13300 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
13310 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20  me,  4, 0,      
13320 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a   "dflt_value"},.
13330 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
13340 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
13350 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
13360 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62  v, ArraySize(tab
13370 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20  leInfoPreface), 
13380 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
13390 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
133a0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
133b0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
133c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
133d0 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
133e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
133f0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13400 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
13410 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13420 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13430 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
13440 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
13450 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
13460 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
13470 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
13480 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13490 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
134a0 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
134b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
134c0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
134d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61   .           pTa
134e0 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  b->aCol[i].zType
134f0 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d   ? pTab->aCol[i]
13500 2e 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65 72 69  .zType : "numeri
13510 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  c", P3_STATIC);.
13520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
13530 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
13540 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f  teger, pTab->aCo
13550 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29  l[i].notNull, 0)
13560 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13570 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13580 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
13590 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
135a0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
135b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
135c0 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29  Dflt, P3_STATIC)
135d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
135e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
135f0 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b  Callback, 5, 0);
13600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13610 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
13620 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
13630 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29  t, "index_info")
13640 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
13650 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
13660 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64  e *pTab;.    pId
13670 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
13680 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 29 3b  dex(db, zRight);
13690 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
136a0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64  .      static Vd
136b0 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72  beOp tableInfoPr
136c0 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eface[] = {.    
136d0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
136e0 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
136f0 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20 20    "seqno"},.    
13700 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
13710 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
13720 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20    "cid"},.      
13730 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
13740 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
13750 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 7d  "name"},.      }
13760 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
13770 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64 78       pTab = pIdx
13780 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->pTable;.      
13790 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
137a0 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
137b0 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63  (tableInfoPrefac
137c0 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  e), tableInfoPre
137d0 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  face);.      for
137e0 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
137f0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
13800 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20       int cnum = 
13810 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
13820 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
13830 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13840 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
13850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13860 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
13870 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29  nteger, cnum, 0)
13880 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13890 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
138a0 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
138b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
138c0 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29  Tab->nCol>cnum )
138d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
138e0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
138f0 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63  -1, pTab->aCol[c
13900 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53  num].zName, P3_S
13910 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
13920 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13930 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
13940 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  3, 0);.      }. 
13950 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
13960 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
13970 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f  p(zLeft, "index_
13980 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
13990 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
139a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
139b0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
139c0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52  FindTable(db, zR
139d0 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ight);.    if( p
139e0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  Tab ){.      v =
139f0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
13a00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49  Parse);.      pI
13a10 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  dx = pTab->pInde
13a20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
13a30 20 70 54 61 62 20 26 26 20 70 49 64 78 20 29 7b   pTab && pIdx ){
13a40 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30  .      int i = 0
13a50 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ; .      static 
13a60 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69 73 74  VdbeOp indexList
13a70 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
13a80 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13a90 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
13aa0 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20      "seq"},.    
13ab0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
13ac0 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
13ad0 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
13ae0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
13af0 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
13b00 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20   "unique"},.    
13b10 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69    };..      sqli
13b20 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
13b30 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64  v, ArraySize(ind
13b40 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20  exListPreface), 
13b50 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65  indexListPreface
13b60 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70  );.      while(p
13b70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Idx){.        sq
13b80 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13b90 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
13ba0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
13bb0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13bc0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
13bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13be0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
13bf0 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
13c00 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
13c10 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13c20 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
13c30 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  r, pIdx->onError
13c40 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20  !=OE_None, 0);. 
13c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
13c60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
13c70 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
13c80 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
13c90 20 20 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e     pIdx = pIdx->
13ca0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
13cb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
13cc0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
13cd0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
13ce0 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f  (zLeft, "parser_
13cf0 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
13d00 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71    extern void sq
13d10 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
13d20 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a  FILE*, char *);.
13d30 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
13d40 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
13d50 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72      sqliteParser
13d60 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70  Trace(stdout, "p
13d70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d  arser: ");.    }
13d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
13d90 74 65 50 61 72 73 65 72 54 72 61 63 65 28 30 2c  teParserTrace(0,
13da0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
13db0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
13dc0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
13dd0 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79  Left, "integrity
13de0 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  _check")==0 ){. 
13df0 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
13e00 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20   checkDb[] = {. 
13e10 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
13e20 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
13e30 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20      "2"},.      
13e40 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
13e50 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
13e60 7d 2c 20 20 20 0a 20 20 20 20 20 20 7b 20 4f 50  },   .      { OP
13e70 5f 4f 70 65 6e 52 65 61 64 2c 20 20 20 20 30 2c  _OpenRead,    0,
13e80 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
13e90 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
13ea0 2c 20 20 20 20 20 20 30 2c 20 37 2c 20 20 20 20  ,      0, 7,    
13eb0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
13ec0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  OP_Column,      
13ed0 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
13ee0 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20      /* 4 */.    
13ef0 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74    { OP_SetInsert
13f00 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  ,   0, 0,       
13f10 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
13f20 4e 65 78 74 2c 20 20 20 20 20 20 20 20 30 2c 20  Next,        0, 
13f30 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  4,        0},.  
13f40 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69      { OP_Integri
13f50 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20 20 20 20  tyCk, 0, 0,     
13f60 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 37 20 2a     0},    /* 7 *
13f70 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
13f80 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
13f90 20 20 20 20 20 20 20 22 69 6e 74 65 67 72 69 74         "integrit
13fa0 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20 20  y_check"},.     
13fb0 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
13fc0 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
13fd0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
13fe0 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30  etInsert,   1, 0
13ff0 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20  ,        "2"},. 
14000 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
14010 72 2c 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  r,     1, 0,    
14020 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
14030 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 20 20 20  OP_OpenRead,    
14040 31 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 2,        0},
14050 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
14060 6e 64 2c 20 20 20 20 20 20 31 2c 20 31 37 2c 20  nd,      1, 17, 
14070 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
14080 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
14090 20 20 31 2c 20 33 2c 20 20 20 20 20 20 20 20 30    1, 3,        0
140a0 7d 2c 20 20 20 20 2f 2a 20 31 34 20 2a 2f 0a 20  },    /* 14 */. 
140b0 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
140c0 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20 20  ert,   1, 0,    
140d0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
140e0 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
140f0 31 2c 20 31 34 2c 20 20 20 20 20 20 20 30 7d 2c  1, 14,       0},
14100 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
14110 67 72 69 74 79 43 6b 2c 20 31 2c 20 31 2c 20 20  grityCk, 1, 1,  
14120 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
14130 31 37 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50  17 */.      { OP
14140 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
14150 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
14160 20 20 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65     };.    sqlite
14170 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
14180 20 41 72 72 61 79 53 69 7a 65 28 63 68 65 63 6b   ArraySize(check
14190 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b 0a 20  Db), checkDb);. 
141a0 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20 20 73   }else..  {}.  s
141b0 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29  qliteFree(zLeft)
141c0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
141d0 52 69 67 68 74 29 3b 0a 7d 0a                    Right);.}.