/ Hex Artifact Content
Login

Artifact be6db117e97d8c47596b09480b1aa2626f083ab3:


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 32 20 32 30  ild.c,v 1.132 20
0310: 30 33 2f 30 33 2f 31 39 20 30 33 3a 31 34 3a 30  03/03/19 03:14:0
0320: 31 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  1 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 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
dc90: 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64  iteSrcListAppend
dca0: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
dcb0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
dcc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
dcd0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
dce0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
dcf0: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
dd00: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
dd10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
dd20: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53    if( (pList->nS
dd30: 72 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20  rc & 7)==0 ){.  
dd40: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
dd50: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20  _item *a;.    a 
dd60: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
dd70: 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74  pList->a, (pList
dd80: 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66  ->nSrc+8)*sizeof
dd90: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
dda0: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
ddb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
ddc0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ddd0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
dde0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
ddf0: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
de00: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
de10: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20  a[pList->nSrc], 
de20: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
de30: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
de40: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  Token ){.    cha
de50: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
de60: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
de70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
de80: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
de90: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
dea0: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  n->n, 0);.    if
deb0: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
dec0: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44    sqliteSrcListD
ded0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
dee0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
def0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
df00: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
df10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
df20: 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
df30: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
df40: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c  ./*.** Add an al
df50: 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ias to the last 
df60: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68  identifier on th
df70: 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
df80: 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  er list..*/.void
df90: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 64   sqliteSrcListAd
dfa0: 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a  dAlias(SrcList *
dfb0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
dfc0: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
dfd0: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72  st && pList->nSr
dfe0: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  c>0 ){.    int i
dff0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d   = pList->nSrc -
e000: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   1;.    sqliteSe
e010: 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d  tNString(&pList-
e020: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54  >a[i].zAlias, pT
e030: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
e040: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  >n, 0);.    sqli
e050: 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d  teDequote(pList-
e060: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  >a[i].zAlias);. 
e070: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
e080: 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
e090: 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69  .void sqliteIdLi
e0a0: 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
e0b0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e0c0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
e0d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
e0e0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e0f0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
e100: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
e110: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
e120: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
e130: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
e140: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
e150: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
e160: 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
e170: 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
e180: 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
e190: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
e1a0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
e1b0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64   sqliteIdListInd
e1c0: 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
e1d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
e1e0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
e1f0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e200: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
e210: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e220: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
e230: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
e240: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
e250: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
e260: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
e270: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
e280: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
e290: 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
e2a0: 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
e2b0: 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
e2c0: 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  oid sqliteSrcLis
e2d0: 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
e2e0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e2f0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
e300: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
e310: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e320: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
e330: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
e340: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
e350: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
e360: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
e370: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
e380: 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c  >a[i].pTab && pL
e390: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e  ist->a[i].pTab->
e3a0: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
e3b0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
e3c0: 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
e3d0: 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
e3e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c   }.    sqliteSel
e3f0: 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  ectDelete(pList-
e400: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
e410: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
e420: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
e430: 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pOn);.    sqlit
e440: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
e450: 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67  ist->a[i].pUsing
e460: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
e470: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
e480: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
e490: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t);.}../*.** The
e4a0: 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73   COPY command is
e4b0: 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69   for compatibili
e4c0: 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53  ty with PostgreS
e4d0: 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69  QL and specifici
e4e0: 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ally.** for the 
e4f0: 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20  ability to read 
e500: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67  the output of pg
e510: 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d  _dump.  The form
e520: 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c  at is as.** foll
e530: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f  ows:.**.**    CO
e540: 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69  PY table FROM fi
e550: 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49  le [USING DELIMI
e560: 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a  TERS string].**.
e570: 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e  ** "table" is an
e580: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
e590: 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72  name.  We will r
e5a0: 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64  ead lines of cod
e5b0: 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74  e from.** file t
e5c0: 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c  o fill this tabl
e5d0: 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69  e with data.  Fi
e5e0: 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64  le might be "std
e5f0: 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e  in".  The option
e600: 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20  al.** delimiter 
e610: 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65  string identifie
e620: 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61  s the field sepa
e630: 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66  rators.  The def
e640: 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a  ault is a tab..*
e650: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70  /.void sqliteCop
e660: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
e670: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
e680: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
e690: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
e6a0: 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65  leName,   /* The
e6b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
e6c0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
e6d0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a   will insert */.
e6e0: 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61    Token *pFilena
e6f0: 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69  me,    /* The fi
e700: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
e710: 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74   obtain informat
e720: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
e730: 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a  pDelimiter,   /*
e740: 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65   Use this as the
e750: 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72   field delimiter
e760: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
e770: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  r          /* Wh
e780: 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63 6f  at to do if a co
e790: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20 2a  nstraint fails *
e7a0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
e7b0: 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 62  ab;.  char *zTab
e7c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  ;.  int i;.  Vdb
e7d0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72  e *v;.  int addr
e7e0: 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a  , end;.  Index *
e7f0: 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 46  pIdx;.  char *zF
e800: 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ile = 0;.  sqlit
e810: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
e820: 64 62 3b 0a 0a 0a 20 20 7a 54 61 62 20 3d 20 73  db;...  zTab = s
e830: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
e840: 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61  omToken(pTableNa
e850: 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
e860: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
e870: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74  || zTab==0 ) got
e880: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
e890: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 54    pTab = sqliteT
e8a0: 61 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28  ableNameToTable(
e8b0: 70 50 61 72 73 65 2c 20 7a 54 61 62 29 3b 0a 20  pParse, zTab);. 
e8c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62   sqliteFree(zTab
e8d0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
e8e0: 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65   ) goto copy_cle
e8f0: 61 6e 75 70 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  anup;.  zFile = 
e900: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46  sqliteStrNDup(pF
e910: 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c  ilename->z, pFil
e920: 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c  ename->n);.  sql
e930: 69 74 65 44 65 71 75 6f 74 65 28 7a 46 69 6c 65  iteDequote(zFile
e940: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41  );.  if( sqliteA
e950: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e960: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
e970: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69  pTab->zName, zFi
e980: 6c 65 29 0a 20 20 20 20 20 20 7c 7c 20 73 71 6c  le).      || sql
e990: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
e9a0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 50 59  rse, SQLITE_COPY
e9b0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
e9c0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  File) ){.    got
e9d0: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
e9e0: 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
e9f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
ea00: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
ea10: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
ea20: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
ea30: 2c 20 31 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d  , 1, pTab->isTem
ea40: 70 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  p);.    addr = s
ea50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ea60: 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30  , OP_FileOpen, 0
ea70: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
ea80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
ea90: 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  addr, pFilename-
eaa0: 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e  >z, pFilename->n
eab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
eac0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
ead0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dr);.    sqliteV
eae0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
eaf0: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 73  nteger, pTab->is
eb00: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  Temp, 0);.    sq
eb10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
eb20: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
eb30: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
eb40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
eb50: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
eb60: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
eb70: 54 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  TIC);.    for(i=
eb80: 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  1, pIdx=pTab->pI
eb90: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
eba0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
ebb0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
ebc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ebd0: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
ebe0: 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20  sTemp, 0);.     
ebf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ec00: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
ec10: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  , i, pIdx->tnum)
ec20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ec30: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
ec40: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
ec50: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
ec60: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
ec70: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
ec80: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
ec90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
eca0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
ecb0: 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0);  /* Initial
ecc0: 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  ize the row coun
ecd0: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65  t */.    }.    e
ece0: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
ecf0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
ed00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
ed10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
ed20: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
ed30: 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66  ol, end);.    if
ed40: 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a  ( pDelimiter ){.
ed50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ed60: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
ed70: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c  , pDelimiter->z,
ed80: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b   pDelimiter->n);
ed90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
eda0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
edb0: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
edc0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
edd0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
ede0: 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20  , "\t", 1);.    
edf0: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
ee00: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
ee10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ee20: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
ee30: 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c  mn, pTab->iPKey,
ee40: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ee50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ee60: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
ee70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ee80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ee90: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
eea0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  no, 0, 0);.    }
eeb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
eec0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
eed0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
eee0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
eef0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
ef00: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
ef10: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65   column is fille
ef20: 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63  d with NULL sinc
ef30: 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  e its.        **
ef40: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
ef50: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
ef60: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
ef70: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
ef80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ef90: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
efa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
efb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
efc0: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
efd0: 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20  lumn, i, 0);.   
efe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
eff0: 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e  qliteGenerateCon
f000: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
f010: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
f020: 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c  , 0, 0, onError,
f030: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
f040: 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  teCompleteInsert
f050: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
f060: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
f070: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
f080: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
f090: 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  Rows)!=0 ){.    
f0a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f0b0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
f0c0: 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65  1, 0);  /* Incre
f0d0: 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  ment row count *
f0e0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
f0f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f100: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
f110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
f120: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f130: 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  end);.    sqlite
f140: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f150: 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
f160: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
f170: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
f180: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
f190: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
f1a0: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20  ntRows ){.      
f1b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f1c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
f1d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
f1e0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
f1f0: 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69  3(v, -1, "rows i
f200: 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41  nserted", P3_STA
f210: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
f220: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f230: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
f240: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
f250: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  copy_cleanup:.  
f260: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 69 6c 65  sqliteFree(zFile
f270: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
f280: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74  /*.** The non-st
f290: 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20 63 6f  andard VACUUM co
f2a0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
f2b0: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61   clean up the da
f2c0: 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61  tabase,.** colla
f2d0: 70 73 65 20 66 72 65 65 20 73 70 61 63 65 2c 20  pse free space, 
f2e0: 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65  etc.  It is mode
f2f0: 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 56  lled after the V
f300: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  ACUUM command.**
f310: 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a   in PostgreSQL..
f320: 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e  **.** In version
f330: 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c 69 74 65   1.0.x of SQLite
f340: 2c 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  , the VACUUM com
f350: 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a  mand would call.
f360: 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69  ** gdbm_reorgani
f370: 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ze() on all the 
f380: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 2e  database tables.
f390: 20 20 42 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a    But beginning.
f3a0: 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30 2c 20 53  ** with 2.0.0, S
f3b0: 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
f3c0: 75 73 65 73 20 47 44 42 4d 20 73 6f 20 74 68 69  uses GDBM so thi
f3d0: 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a  s command has.**
f3e0: 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e   become a no-op.
f3f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56  .*/.void sqliteV
f400: 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50 61  acuum(Parse *pPa
f410: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  rse, Token *pTab
f420: 6c 65 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f  leName){.  /* Do
f430: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   nothing */.}../
f440: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
f450: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
f460: 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e   sqliteBeginTran
f470: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
f480: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
f490: 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  or){.  sqlite *d
f4a0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
f4b0: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
f4c0: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
f4d0: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
f4e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f4f0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
f500: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
f510: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f520: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
f530: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f540: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
f550: 22 42 45 47 49 4e 22 2c 20 30 29 20 29 20 72 65  "BEGIN", 0) ) re
f560: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
f570: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
f580: 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 70 50  nTrans ){.    pP
f590: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
f5a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
f5b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
f5c0: 73 67 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72  sg, "cannot star
f5d0: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
f5e0: 22 0a 20 20 20 20 20 20 20 22 77 69 74 68 69 6e  ".       "within
f5f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c   a transaction",
f600: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
f610: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67  .  }.  sqliteBeg
f620: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
f630: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
f640: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
f650: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
f660: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f   db->onError = o
f670: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
f680: 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
f690: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
f6a0: 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61  liteCommitTransa
f6b0: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
f6c0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
f6d0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
f6e0: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
f6f0: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
f700: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
f710: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f720: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
f730: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
f740: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
f750: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
f760: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f770: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
f780: 20 22 43 4f 4d 4d 49 54 22 2c 20 30 29 20 29 20   "COMMIT", 0) ) 
f790: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
f7a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
f7b0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
f7c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
f7d0: 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  r++;.    sqliteS
f7e0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
f7f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
f800: 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69     "cannot commi
f810: 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
f820: 6f 6e 20 69 73 20 61 63 74 69 76 65 22 2c 20 30  on is active", 0
f830: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
f840: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26   }.  db->flags &
f850: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
f860: 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72  s;.  sqliteEndWr
f870: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
f880: 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rse);.  db->onEr
f890: 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  ror = OE_Default
f8a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
f8b0: 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
f8c0: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
f8d0: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
f8e0: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
f8f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
f900: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
f910: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
f920: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
f930: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
f940: 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
f950: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
f960: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
f970: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
f980: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
f990: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
f9a0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
f9b0: 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
f9c0: 41 43 4b 22 2c 20 30 29 20 29 20 72 65 74 75 72  ACK", 0) ) retur
f9d0: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
f9e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
f9f0: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
fa00: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
fa10: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
fa20: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
fa30: 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 22 63 61  rMsg,.       "ca
fa40: 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20  nnot rollback - 
fa50: 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
fa60: 73 20 61 63 74 69 76 65 22 2c 20 30 29 3b 0a 20  s active", 0);. 
fa70: 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a     return; .  }.
fa80: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
fa90: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
faa0: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
fab0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fac0: 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30  P_Rollback, 0, 0
fad0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
fae0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
faf0: 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45  Trans;.  db->onE
fb00: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
fb10: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
fb20: 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
fb30: 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20  hat will verify 
fb40: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
fb50: 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d  e for all.** nam
fb60: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
fb70: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
fb80: 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  eCodeVerifySchem
fb90: 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  a(Parse *pParse)
fba0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
fbb0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
fbc0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
fbd0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
fbe0: 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
fbf0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
fc00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
fc10: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  >aDb[i].zName==0
fc20: 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   || db->aDb[i].p
fc30: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
fc40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
fc50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
fc60: 66 79 43 6f 6f 6b 69 65 2c 20 30 2c 20 64 62 2d  fyCookie, 0, db-
fc70: 3e 61 44 62 5b 69 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[i].schema_c
fc80: 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 20 20 70 50  ookie);.  }.  pP
fc90: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
fca0: 66 69 65 64 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  fied = 1;.}../*.
fcb0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
fcc0: 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
fcd0: 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
fce0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
fcf0: 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
fd00: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
fd10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fd20: 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
fd30: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
fd40: 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
fd50: 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
fd60: 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
fd70: 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
fd80: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
fd90: 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
fda0: 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
fdb0: 20 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69   the setCheckpoi
fdc0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
fdd0: 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
fde0: 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
fdf0: 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
fe00: 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
fe10: 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
fe20: 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
fe30: 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
fe40: 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
fe50: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
fe60: 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
fe70: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
fe80: 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
fe90: 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
fea0: 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
feb0: 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
fec0: 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
fed0: 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
fee0: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
fef0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
ff00: 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
ff10: 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
ff20: 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
ff30: 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
ff40: 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
ff50: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
ff60: 74 65 6d 70 4f 6e 6c 79 20 66 6c 61 67 20 69 6e  tempOnly flag in
ff70: 64 69 63 61 74 65 73 20 74 68 61 74 20 6f 6e 6c  dicates that onl
ff80: 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
ff90: 65 73 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  es will be chang
ffa0: 65 64 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 69  ed.** during thi
ffb0: 73 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  s write operatio
ffc0: 6e 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79 20  n.  The primary 
ffd0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
ffe0: 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 65 2d 6c  s not.** write-l
fff0: 6f 63 6b 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65  ocked.  Only the
10000 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
10010 61 73 65 20 66 69 6c 65 20 67 65 74 73 20 61 20  ase file gets a 
10020 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f  write lock..** O
10030 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
10040 61 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  an continue to r
10050 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
10060 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73   primary databas
10070 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
10080 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
10090 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
100a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
100b0 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20  Checkpoint, int 
100c0 74 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56 64 62  tempOnly){.  Vdb
100d0 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69  e *v;.  v = sqli
100e0 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
100f0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
10100 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
10110 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
10120 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20  ) return; /* if 
10130 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69  this is in a tri
10140 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70  gger */.  if( (p
10150 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10160 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
10170 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)==0 ){.    sql
10180 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10190 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
101a0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
101b0 74 65 6d 70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  tempOnly ){.    
101c0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
101d0 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
101e0 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ion, 0, 0);.    
101f0 20 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69    sqliteCodeVeri
10200 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  fySchema(pParse)
10210 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
10220 69 66 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  if( setCheckpoin
10230 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  t ){.    sqliteV
10240 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10250 68 65 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29  heckpoint, 0, 0)
10260 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
10270 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63  AddOp(v, OP_Chec
10280 6b 70 6f 69 6e 74 2c 20 31 2c 20 30 29 3b 0a 20  kpoint, 1, 0);. 
10290 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
102a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
102b0 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72  oncludes an oper
102c0 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68  ation that may h
102d0 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74  ave changed.** t
102e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
102f0 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f  is is a companio
10300 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65  n function to Be
10310 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
10320 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61  n()..** If a tra
10330 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
10340 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  rted, then commi
10350 74 20 69 74 2e 20 20 49 66 20 61 20 63 68 65 63  t it.  If a chec
10360 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74  kpoint was.** st
10370 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69  arted then commi
10380 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  t that..*/.void 
10390 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
103a0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
103b0 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
103c0 76 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  v;.  if( pParse-
103d0 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74  >trigStack ) ret
103e0 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20  urn; /* if this 
103f0 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20  is in a trigger 
10400 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
10410 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10420 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
10430 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
10440 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
10450 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
10460 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69  .    /* Do Nothi
10470 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ng */.  }else{. 
10480 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10490 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
104a0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a   0, 0);.  }.}...
104b0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
104c0 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
104d0 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
104e0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
104f0 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68  nt getBoolean(ch
10500 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63  ar *z){.  static
10510 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20   char *azTrue[] 
10520 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c  = { "yes", "on",
10530 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74   "true" };.  int
10540 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d   i;.  if( z[0]==
10550 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10560 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d  if( isdigit(z[0]
10570 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20  ) || (z[0]=='-' 
10580 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29  && isdigit(z[1])
10590 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
105a0 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66  atoi(z);.  }.  f
105b0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
105c0 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28  (azTrue)/sizeof(
105d0 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29  azTrue[0]); i++)
105e0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
105f0 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65  StrICmp(z,azTrue
10600 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  [i])==0 ) return
10610 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
10620 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74   0;.}../*.** Int
10630 65 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e  erpret the given
10640 20 73 74 72 69 6e 67 20 61 73 20 61 20 73 61 66   string as a saf
10650 65 74 79 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  ety level.  Retu
10660 72 6e 20 30 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a  rn 0 for OFF,.**
10670 20 31 20 66 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52   1 for ON or NOR
10680 4d 41 4c 20 61 6e 64 20 32 20 66 6f 72 20 46 55  MAL and 2 for FU
10690 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  LL..**.** Note t
106a0 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
106b0 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e 65 20  eturned are one 
106c0 6c 65 73 73 20 74 68 61 74 20 74 68 65 20 76 61  less that the va
106d0 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73 68 6f  lues that.** sho
106e0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 69 6e  uld be passed in
106f0 74 6f 20 73 71 6c 69 74 65 42 74 72 65 65 53 65  to sqliteBtreeSe
10700 74 53 61 66 65 74 79 4c 65 76 65 6c 28 29 2e 20  tSafetyLevel(). 
10710 20 54 68 65 20 69 73 20 64 6f 6e 65 0a 2a 2a 20   The is done.** 
10720 74 6f 20 73 75 70 70 6f 72 74 20 6c 65 67 61 63  to support legac
10730 79 20 53 51 4c 20 63 6f 64 65 2e 20 20 54 68 65  y SQL code.  The
10740 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 75 73   safety level us
10750 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c 65 61 6e  ed to be boolean
10760 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72 20 73 63  .** and older sc
10770 72 69 70 74 73 20 6d 61 79 20 68 61 76 65 20 75  ripts may have u
10780 73 65 64 20 6e 75 6d 62 65 72 73 20 30 20 66 6f  sed numbers 0 fo
10790 72 20 4f 46 46 20 61 6e 64 20 31 20 66 6f 72 20  r OFF and 1 for 
107a0 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ON..*/.static in
107b0 74 20 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c  t getSafetyLevel
107c0 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61  (char *z){.  sta
107d0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
107e0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
107f0 72 20 2a 7a 57 6f 72 64 3b 0a 20 20 20 20 69 6e  r *zWord;.    in
10800 74 20 76 61 6c 3b 0a 20 20 7d 20 61 4b 65 79 5b  t val;.  } aKey[
10810 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 6f 22  ] = {.    { "no"
10820 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20  ,    0 },.    { 
10830 22 6f 66 66 22 2c 20 20 20 30 20 7d 2c 0a 20 20  "off",   0 },.  
10840 20 20 7b 20 22 66 61 6c 73 65 22 2c 20 30 20 7d    { "false", 0 }
10850 2c 0a 20 20 20 20 7b 20 22 79 65 73 22 2c 20 20  ,.    { "yes",  
10860 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6e 22   1 },.    { "on"
10870 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20  ,    1 },.    { 
10880 22 74 72 75 65 22 2c 20 20 31 20 7d 2c 0a 20 20  "true",  1 },.  
10890 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 32 20 7d    { "full",  2 }
108a0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
108b0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20    if( z[0]==0 ) 
108c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
108d0 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c  isdigit(z[0]) ||
108e0 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69   (z[0]=='-' && i
108f0 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b  sdigit(z[1])) ){
10900 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69  .    return atoi
10910 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (z);.  }.  for(i
10920 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4b 65  =0; i<sizeof(aKe
10930 79 29 2f 73 69 7a 65 6f 66 28 61 4b 65 79 5b 30  y)/sizeof(aKey[0
10940 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
10950 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
10960 7a 2c 61 4b 65 79 5b 69 5d 2e 7a 57 6f 72 64 29  z,aKey[i].zWord)
10970 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 4b 65  ==0 ) return aKe
10980 79 5b 69 5d 2e 76 61 6c 3b 0a 20 20 7d 0a 20 20  y[i].val;.  }.  
10990 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
109a0 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61  ** Process a pra
109b0 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  gma statement.  
109c0 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61  .**.** Pragmas a
109d0 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a  re of this form:
109e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47  .**.**      PRAG
109f0 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a  MA id = value.**
10a00 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
10a10 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
10a20 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
10a30 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
10a40 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
10a50 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
10a60 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
10a70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
10a80 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
10a90 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
10aa0 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
10ab0 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f  inus sign..*/.vo
10ac0 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28  id sqlitePragma(
10ad0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
10ae0 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
10af0 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  en *pRight, int 
10b00 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68  minusFlag){.  ch
10b10 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20  ar *zLeft = 0;. 
10b20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
10b30 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  0;.  sqlite *db 
10b40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10b50 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
10b60 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10b70 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
10b80 74 75 72 6e 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d  turn;..  zLeft =
10b90 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
10ba0 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e  Left->z, pLeft->
10bb0 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
10bc0 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66  ote(zLeft);.  if
10bd0 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
10be0 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20     zRight = 0;. 
10bf0 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
10c00 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22  ing(&zRight, "-"
10c10 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20  , 1, pRight->z, 
10c20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20  pRight->n, 0);. 
10c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67   }else{.    zRig
10c40 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ht = sqliteStrND
10c50 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52  up(pRight->z, pR
10c60 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  ight->n);.    sq
10c70 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67  liteDequote(zRig
10c80 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ht);.  }.  if( s
10c90 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
10ca0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
10cb0 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
10cc0 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
10cd0 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20  teFree(zLeft);. 
10ce0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52     sqliteFree(zR
10cf0 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
10d00 6e 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20  n;.  }. .  /*.  
10d10 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
10d20 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  lt_cache_size.  
10d30 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
10d40 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a  lt_cache_size=N.
10d50 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
10d60 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
10d70 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 65 72   the current per
10d80 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20  sistent setting 
10d90 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
10da0 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54  e cache size.  T
10db0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
10dc0 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  d is the maximum
10dd0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
10de0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
10df0 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65  e cache.  The se
10e00 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62  cond form sets b
10e10 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a  oth the current.
10e20 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
10e30 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74  size value and t
10e40 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 70 61  he persistent pa
10e50 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
10e60 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  lue.  ** stored 
10e70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
10e80 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file..  **.  ** 
10e90 54 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68  The default cach
10ea0 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64  e size is stored
10eb0 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32   in meta-value 2
10ec0 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20 74 68   of page 1 of th
10ed0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
10ee0 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65  file.  The cache
10ef0 20 73 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c   size is actuall
10f00 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  y the absolute v
10f10 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69  alue of.  ** thi
10f20 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
10f30 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20  n.  The sign of 
10f40 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74  meta-value 2 det
10f50 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a  ermines the.  **
10f60 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
10f70 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76  ting.  A negativ
10f80 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79  e value means sy
10f90 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10fa0 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69  .  ** and a posi
10fb0 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73  tive value means
10fc0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10fd0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  on..  */.  if( s
10fe0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10ff0 66 74 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68  ft,"default_cach
11000 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  e_size")==0 ){. 
11010 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
11020 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20   getCacheSize[] 
11030 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
11040 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32  eadCookie,  0, 2
11050 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
11060 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65     { OP_AbsValue
11070 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
11080 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11090 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c  _Dup,         0,
110a0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
110b0 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
110c0 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
110d0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
110e0 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20  OP_Ne,          
110f0 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 6,        0},
11100 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
11110 67 65 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47  ger,     MAX_PAG
11120 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  ES,0, 0},.      
11130 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
11140 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
11150 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20  cache_size"},.  
11160 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
11170 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
11180 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
11190 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
111a0 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
111b0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
111c0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
111d0 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
111e0 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 29  ), getCacheSize)
111f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11200 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
11210 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74     int size = at
11220 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
11230 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
11240 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
11250 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
11260 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
11270 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rse, 0, 0);.    
11280 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11290 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
112a0 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20   size, 0);.     
112b0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
112c0 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
112d0 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
112e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
112f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
11300 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
11310 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11320 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
11330 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
11340 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11350 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30  , OP_Negative, 0
11360 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11370 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11380 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
11390 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
113a0 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
113b0 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  n(pParse);.     
113c0 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
113d0 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
113e0 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a  <0 ? -size : siz
113f0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
11400 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
11410 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
11420 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
11430 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11440 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
11450 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  MA cache_size.  
11460 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  **  PRAGMA cache
11470 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
11480 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
11490 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
114a0 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
114b0 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
114c0 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
114d0 20 20 54 68 65 20 6c 6f 63 61 6c 20 73 65 74 74    The local sett
114e0 69 6e 67 20 63 61 6e 20 62 65 20 64 69 66 66 65  ing can be diffe
114f0 72 65 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  rent from.  ** t
11500 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 63 61  he persistent ca
11510 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 74  che size value t
11520 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  hat is stored in
11530 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
11540 2a 2a 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20  ** file itself. 
11550 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
11560 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ned is the maxim
11570 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
11580 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  * pages in the p
11590 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  age cache.  The 
115a0 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
115b0 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20   the local.  ** 
115c0 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
115d0 76 61 6c 75 65 2e 20 20 49 74 20 64 6f 65 73 20  value.  It does 
115e0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
115f0 65 72 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63  ersistent.  ** c
11600 61 63 68 65 20 73 69 7a 65 20 73 74 6f 72 65 64  ache size stored
11610 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 73 6f 20   on the disk so 
11620 74 68 65 20 63 61 63 68 65 20 73 69 7a 65 20 77  the cache size w
11630 69 6c 6c 20 72 65 76 65 72 74 0a 20 20 2a 2a 20  ill revert.  ** 
11640 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 76  to its default v
11650 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 64 61  alue when the da
11660 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
11670 20 61 6e 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20   and reopened.. 
11680 20 2a 2a 20 4e 20 73 68 6f 75 6c 64 20 62 65 20   ** N should be 
11690 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  a positive integ
116a0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  er..  */.  if( s
116b0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
116c0 66 74 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29  ft,"cache_size")
116d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
116e0 63 20 56 64 62 65 4f 70 20 67 65 74 43 61 63 68  c VdbeOp getCach
116f0 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eSize[] = {.    
11700 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11710 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
11720 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a   "cache_size"},.
11730 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
11740 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
11750 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
11760 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
11770 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
11780 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
11790 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b  db->cache_size;;
117a0 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c  .      if( size<
117b0 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65  0 ) size = -size
117c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
117d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
117e0 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b  teger, size, 0);
117f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
11800 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
11810 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65  raySize(getCache
11820 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53  Size), getCacheS
11830 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
11840 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
11850 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  = atoi(zRight);.
11860 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
11870 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
11880 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63  .      if( db->c
11890 61 63 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69  ache_size<0 ) si
118a0 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
118b0 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65    db->cache_size
118c0 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73   = size;.      s
118d0 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63  qliteBtreeSetCac
118e0 68 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  heSize(db->aDb[0
118f0 5d 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63 68 65  ].pBt, db->cache
11900 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
11910 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
11920 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
11930 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a  _synchronous.  *
11940 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c  *  PRAGMA defaul
11950 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 4e  t_synchronous=ON
11960 7c 4f 46 46 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c  |OFF|NORMAL|FULL
11970 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
11980 69 72 73 74 20 66 6f 72 6d 20 72 65 74 75 72 6e  irst form return
11990 73 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  s the persistent
119a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 73   value of the "s
119b0 79 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65 74 74  ynchronous" sett
119c0 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ing.  ** that is
119d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
119e0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
119f0 73 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  s the synchronou
11a00 73 20 73 65 74 74 69 6e 67 20 74 68 61 74 0a 20  s setting that. 
11a10 20 2a 2a 20 69 73 20 75 73 65 64 20 77 68 65 6e   ** is used when
11a20 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
11a30 65 20 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65  e is opened unle
11a40 73 73 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  ss overridden by
11a50 20 61 20 73 65 70 61 72 61 74 65 0a 20 20 2a 2a   a separate.  **
11a60 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70   "synchronous" p
11a70 72 61 67 6d 61 2e 20 20 54 68 65 20 73 65 63 6f  ragma.  The seco
11a80 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20  nd form changes 
11a90 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 61  the persistent a
11aa0 6e 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61  nd the.  ** loca
11ab0 6c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65  l synchronous se
11ac0 74 74 69 6e 67 20 74 6f 20 74 68 65 20 76 61 6c  tting to the val
11ad0 75 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20  ue given..  **. 
11ae0 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f   ** If synchrono
11af0 75 73 20 69 73 20 4f 46 46 2c 20 53 51 4c 69 74  us is OFF, SQLit
11b00 65 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  e does not attem
11b10 70 74 20 61 6e 79 20 66 73 79 6e 63 28 29 20 73  pt any fsync() s
11b20 79 73 74 65 6d 73 20 63 61 6c 6c 73 0a 20 20 2a  ystems calls.  *
11b30 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 64  * to make sure d
11b40 61 74 61 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ata is committed
11b50 20 74 6f 20 64 69 73 6b 2e 20 20 57 72 69 74 65   to disk.  Write
11b60 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
11b70 76 65 72 79 20 66 61 73 74 2c 0a 20 20 2a 2a 20  very fast,.  ** 
11b80 62 75 74 20 61 20 70 6f 77 65 72 20 66 61 69 6c  but a power fail
11b90 75 72 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68  ure can leave th
11ba0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e  e database in an
11bb0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   inconsistent st
11bc0 61 74 65 2e 0a 20 20 2a 2a 20 49 66 20 73 79 6e  ate..  ** If syn
11bd0 63 68 72 6f 6e 6f 75 73 20 69 73 20 4f 4e 20 6f  chronous is ON o
11be0 72 20 4e 4f 52 4d 41 4c 2c 20 53 51 4c 69 74 65  r NORMAL, SQLite
11bf0 20 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e   will do an fsyn
11c00 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
11c10 74 6f 0a 20 20 2a 2a 20 6d 61 6b 65 20 73 75 72  to.  ** make sur
11c20 65 20 64 61 74 61 20 69 73 20 62 65 69 6e 67 20  e data is being 
11c30 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
11c40 20 20 54 68 65 20 72 69 73 6b 20 6f 66 20 63 6f    The risk of co
11c50 72 72 75 70 74 69 6f 6e 20 64 75 65 20 74 6f 0a  rruption due to.
11c60 20 20 2a 2a 20 61 20 70 6f 77 65 72 20 6c 6f 73    ** a power los
11c70 73 20 69 6e 20 74 68 69 73 20 6d 6f 64 65 20 69  s in this mode i
11c80 73 20 6e 65 67 6c 69 67 69 62 6c 65 20 62 75 74  s negligible but
11c90 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 73   non-zero.  If s
11ca0 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20  ynchronous.  ** 
11cb0 69 73 20 46 55 4c 4c 2c 20 65 78 74 72 61 20 66  is FULL, extra f
11cc0 73 79 6e 63 28 29 73 20 6f 63 63 75 72 20 74 6f  sync()s occur to
11cd0 20 72 65 64 75 63 65 20 74 68 65 20 72 69 73 6b   reduce the risk
11ce0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 74   of corruption t
11cf0 6f 20 6e 65 61 72 0a 20 20 2a 2a 20 7a 65 72 6f  o near.  ** zero
11d00 2c 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  , but with a wri
11d10 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70  te performance p
11d20 65 6e 61 6c 74 79 2e 20 20 54 68 65 20 64 65 66  enalty.  The def
11d30 61 75 6c 74 20 6d 6f 64 65 20 69 73 20 4e 4f 52  ault mode is NOR
11d40 4d 41 4c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MAL..  */.  if( 
11d50 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
11d60 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e  eft,"default_syn
11d70 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b  chronous")==0 ){
11d80 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
11d90 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b  Op getSync[] = {
11da0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
11db0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
11dc0 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f        "synchrono
11dd0 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  us"},.      { OP
11de0 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c  _ReadCookie,  0,
11df0 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   3,        0},. 
11e00 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20       { OP_Dup,  
11e10 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
11e20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
11e30 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20  OP_If,          
11e40 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
11e50 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
11e60 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
11e70 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
11e80 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
11e90 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c  teger,     0, 0,
11ea0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
11eb0 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20    { OP_Lt,      
11ec0 20 20 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20      0, 5,       
11ed0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11ee0 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20  AddImm,      1, 
11ef0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11f00 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
11f10 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
11f20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
11f30 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 30  P_Halt,        0
11f40 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
11f50 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d        { OP_AddIm
11f60 6d 2c 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20  m,     -1, 0,   
11f70 20 20 20 20 20 30 7d 2c 20 20 2f 2a 20 31 30 20       0},  /* 10 
11f80 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  */.      { OP_Ca
11f90 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
11fa0 20 20 20 20 20 20 20 20 30 7d 0a 20 20 20 20 7d          0}.    }
11fb0 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
11fc0 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
11fd0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
11fe0 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
11ff0 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
12000 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74  ze(getSync), get
12010 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sync);.      sql
12020 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28  iteVdbeChangeP2(
12030 76 2c 20 61 64 64 72 2b 33 2c 20 61 64 64 72 2b  v, addr+3, addr+
12040 31 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  10);.    }else{.
12050 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
12060 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
12070 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b   db->cache_size;
12080 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c  .      if( size<
12090 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65  0 ) size = -size
120a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65  ;.      sqliteBe
120b0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
120c0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  n(pParse, 0, 0);
120d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
120e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61  eAddOp(v, OP_Rea
120f0 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  dCookie, 0, 2);.
12100 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12110 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
12120 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   0, 0);.      ad
12130 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
12140 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
12150 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  er, 0, 0);.     
12160 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12170 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 61 64  (v, OP_Ne, 0, ad
12180 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
12190 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
121a0 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d 41 58 5f 50  OP_AddImm, MAX_P
121b0 41 47 45 53 2c 20 30 29 3b 0a 20 20 20 20 20 20  AGES, 0);.      
121c0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
121d0 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20  v, OP_AbsValue, 
121e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d  0, 0);.      db-
121f0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
12200 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
12210 52 69 67 68 74 29 2b 31 3b 0a 20 20 20 20 20 20  Right)+1;.      
12220 69 66 28 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c  if( db->safety_l
12230 65 76 65 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  evel==1 ){.     
12240 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12250 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
12260 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
12270 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a    size = -size;.
12280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12290 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
122a0 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
122b0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
122c0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
122d0 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73  P_Integer, db->s
122e0 61 66 65 74 79 5f 6c 65 76 65 6c 2c 20 30 29 3b  afety_level, 0);
122f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12300 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
12310 43 6f 6f 6b 69 65 2c 20 30 2c 20 33 29 3b 0a 20  Cookie, 0, 3);. 
12320 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
12330 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
12340 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
12350 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
12360 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
12370 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
12380 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
12390 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
123a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
123b0 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
123c0 6c 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  l(db->aDb[0].pBt
123d0 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  , db->safety_lev
123e0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  el);.    }.  }el
123f0 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  se..  /*.  **   
12400 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
12410 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
12420 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
12430 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a  |ON|NORMAL|FULL.
12440 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
12450 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
12460 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  l value of the s
12470 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e  ynchronous flag.
12480 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
12490 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
124a0 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
124b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
124c0 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20  k file and the. 
124d0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
124e0 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
124f0 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
12500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
12510 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20  .  ** opened..  
12520 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
12530 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79  trICmp(zLeft,"sy
12540 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29  nchronous")==0 )
12550 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
12560 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20  eOp getSync[] = 
12570 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  {.      { OP_Col
12580 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
12590 20 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e         "synchron
125a0 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ous"},.      { O
125b0 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
125c0 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
125d0 20 20 20 20 7d 3b 0a 20 20 20 20 69 66 28 20 70      };.    if( p
125e0 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d  Right->z==pLeft-
125f0 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
12600 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12610 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73  P_Integer, db->s
12620 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 2c 20 30  afety_level-1, 0
12630 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12640 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
12650 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e  ArraySize(getSyn
12660 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20  c), getSync);.  
12670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
12680 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61  nt size = db->ca
12690 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20  che_size;.      
126a0 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
126b0 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
126c0 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65   db->safety_leve
126d0 6c 20 3d 20 67 65 74 53 61 66 65 74 79 4c 65 76  l = getSafetyLev
126e0 65 6c 28 7a 52 69 67 68 74 29 2b 31 3b 0a 20 20  el(zRight)+1;.  
126f0 20 20 20 20 69 66 28 20 64 62 2d 3e 73 61 66 65      if( db->safe
12700 74 79 5f 6c 65 76 65 6c 3d 3d 31 20 29 20 73 69  ty_level==1 ) si
12710 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
12720 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65    db->cache_size
12730 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73   = size;.      s
12740 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63  qliteBtreeSetCac
12750 68 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  heSize(db->aDb[0
12760 5d 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63 68 65  ].pBt, db->cache
12770 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 73 71  _size);.      sq
12780 6c 69 74 65 42 74 72 65 65 53 65 74 53 61 66 65  liteBtreeSetSafe
12790 74 79 4c 65 76 65 6c 28 64 62 2d 3e 61 44 62 5b  tyLevel(db->aDb[
127a0 30 5d 2e 70 42 74 2c 20 64 62 2d 3e 73 61 66 65  0].pBt, db->safe
127b0 74 79 5f 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  ty_level);.    }
127c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
127d0 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
127e0 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f 6f 76  eft, "trigger_ov
127f0 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d 3d 30  erhead_test")==0
12800 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
12810 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
12820 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63  {.      always_c
12830 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75  ode_trigger_setu
12840 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 1;.    }else
12850 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63  {.      always_c
12860 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75  ode_trigger_setu
12870 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  p = 0;.    }.  }
12880 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
12890 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
128a0 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d   "vdbe_trace")==
128b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
128c0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
128d0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
128e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62  gs |= SQLITE_Vdb
128f0 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73  eTrace;.    }els
12900 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
12910 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64  gs &= ~SQLITE_Vd
12920 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20  beTrace;.    }. 
12930 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
12940 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
12950 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  t, "full_column_
12960 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  names")==0 ){.  
12970 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
12980 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
12990 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
129a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
129b0 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  es;.    }else{. 
129c0 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
129d0 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
129e0 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20  lNames;.    }.  
129f0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
12a00 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
12a10 2c 20 22 73 68 6f 77 5f 64 61 74 61 74 79 70 65  , "show_datatype
12a20 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
12a30 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
12a40 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
12a50 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
12a60 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20  E_ReportTypes;. 
12a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a80 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
12a90 4c 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73  LITE_ReportTypes
12aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
12ab0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
12ac0 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73  ICmp(zLeft, "res
12ad0 75 6c 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22  ult_set_details"
12ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
12af0 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
12b00 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
12b10 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12b20 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20  ResultDetails;. 
12b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b40 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
12b50 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69  LITE_ResultDetai
12b60 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ls;.    }.  }els
12b70 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
12b80 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63  trICmp(zLeft, "c
12b90 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d  ount_changes")==
12ba0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
12bb0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
12bc0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
12bd0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75  gs |= SQLITE_Cou
12be0 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73  ntRows;.    }els
12bf0 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
12c00 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f  gs &= ~SQLITE_Co
12c10 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20  untRows;.    }. 
12c20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
12c30 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
12c40 74 2c 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74  t, "empty_result
12c50 5f 63 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20  _callbacks")==0 
12c60 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
12c70 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
12c80 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
12c90 20 7c 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43   |= SQLITE_NullC
12ca0 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c  allback;.    }el
12cb0 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
12cc0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e  ags &= ~SQLITE_N
12cd0 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  ullCallback;.   
12ce0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
12cf0 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
12d00 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e  zLeft, "table_in
12d10 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54  fo")==0 ){.    T
12d20 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
12d30 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
12d40 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
12d50 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  t);.    if( pTab
12d60 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
12d70 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66   VdbeOp tableInf
12d80 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20  oPreface[] = {. 
12d90 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
12da0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
12db0 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20       "cid"},.   
12dc0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
12dd0 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20  Name,  1, 0,    
12de0 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20     "name"},.    
12df0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
12e00 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20  ame,  2, 0,     
12e10 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20    "type"},.     
12e20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
12e30 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20  me,  3, 0,      
12e40 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20   "notnull"},.   
12e50 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
12e60 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20  Name,  4, 0,    
12e70 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d     "dflt_value"}
12e80 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
12e90 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
12ea0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
12eb0 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74  t(v, ArraySize(t
12ec0 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
12ed0 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  , tableInfoPrefa
12ee0 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ce);.      sqlit
12ef0 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
12f00 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
12f10 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
12f20 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
12f30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
12f40 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12f50 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
12f60 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
12f70 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12f80 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
12f90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12fa0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
12fb0 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  1, pTab->aCol[i]
12fc0 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  .zName, P3_STATI
12fd0 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
12fe0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12ff0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
13000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13010 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
13020 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  1, .           p
13030 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  Tab->aCol[i].zTy
13040 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe ? pTab->aCol[
13050 69 5d 2e 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65  i].zType : "nume
13060 72 69 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ric", P3_STATIC)
13070 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13080 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13090 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61  Integer, pTab->a
130a0 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20  Col[i].notNull, 
130b0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
130c0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
130d0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
130e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
130f0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
13100 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  1, pTab->aCol[i]
13110 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49  .zDflt, P3_STATI
13120 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
13130 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13140 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30  P_Callback, 5, 0
13150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13160 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
13170 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
13180 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f  eft, "index_info
13190 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  ")==0 ){.    Ind
131a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
131b0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
131c0 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
131d0 49 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74  Index(db, zRight
131e0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
131f0 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
13200 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f  VdbeOp tableInfo
13210 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
13220 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13230 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
13240 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20      "seqno"},.  
13250 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13260 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
13270 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
13280 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
13290 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20  ame,  2, 0,     
132a0 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
132b0 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
132c0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49  .      pTab = pI
132d0 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  dx->pTable;.    
132e0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
132f0 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
13300 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
13310 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
13320 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66  reface);.      f
13330 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
13340 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
13350 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20         int cnum 
13360 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
13370 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
13380 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
13390 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
133a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
133b0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
133c0 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20  _Integer, cnum, 
133d0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
133e0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
133f0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
13400 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13410 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d   pTab->nCol>cnum
13420 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
13430 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
13440 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
13450 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33  [cnum].zName, P3
13460 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
13470 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
13480 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
13490 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 3, 0);.      }
134a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
134b0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
134c0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
134d0 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20  x_list")==0 ){. 
134e0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
134f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
13500 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
13510 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
13520 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
13530 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76   pTab ){.      v
13540 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
13550 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
13560 70 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e  pIdx = pTab->pIn
13570 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
13580 66 28 20 70 54 61 62 20 26 26 20 70 49 64 78 20  f( pTab && pIdx 
13590 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d  ){.      int i =
135a0 20 30 3b 20 0a 20 20 20 20 20 20 73 74 61 74 69   0; .      stati
135b0 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78 4c 69  c VdbeOp indexLi
135c0 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a  stPreface[] = {.
135d0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
135e0 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
135f0 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20        "seq"},.  
13600 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13610 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
13620 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
13630 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
13640 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
13650 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20     "unique"},.  
13660 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71      };..      sq
13670 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
13680 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69  t(v, ArraySize(i
13690 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
136a0 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  , indexListPrefa
136b0 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ce);.      while
136c0 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20  (pIdx){.        
136d0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
136e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
136f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13700 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13710 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
13720 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13730 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
13740 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
13750 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
13760 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
13770 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
13780 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ger, pIdx->onErr
13790 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b  or!=OE_None, 0);
137a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
137b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
137c0 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
137d0 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20          ++i;.   
137e0 20 20 20 20 20 70 49 64 78 20 3d 20 70 49 64 78       pIdx = pIdx
137f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
13800 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
13810 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13820 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
13830 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65  mp(zLeft, "parse
13840 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a  r_trace")==0 ){.
13850 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
13860 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
13870 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29  e(FILE*, char *)
13880 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  ;.    if( getBoo
13890 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
138a0 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73        sqlitePars
138b0 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20  erTrace(stdout, 
138c0 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20  "parser: ");.   
138d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
138e0 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
138f0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
13900 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
13910 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
13920 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69  (zLeft, "integri
13930 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b  ty_check")==0 ){
13940 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
13950 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b  Op checkDb[] = {
13960 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
13970 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20  nsert,   0, 0,  
13980 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20        "2"},.    
13990 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
139a0 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
139b0 20 30 7d 2c 20 20 20 0a 20 20 20 20 20 20 7b 20   0},   .      { 
139c0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 20 20 20  OP_OpenRead,    
139d0 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
139e0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
139f0 6e 64 2c 20 20 20 20 20 20 30 2c 20 37 2c 20 20  nd,      0, 7,  
13a00 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
13a10 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
13a20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
13a30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20  },    /* 4 */.  
13a40 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65      { OP_SetInse
13a50 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20  rt,   0, 0,     
13a60 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
13a70 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20 30  P_Next,        0
13a80 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 4,        0},.
13a90 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
13aa0 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20 20  rityCk, 0, 0,   
13ab0 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 37       0},    /* 7
13ac0 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
13ad0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
13ae0 2c 20 20 20 20 20 20 20 20 22 69 6e 74 65 67 72  ,        "integr
13af0 69 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20  ity_check"},.   
13b00 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
13b10 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
13b20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
13b30 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c  _SetInsert,   1,
13b40 20 30 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c   0,        "2"},
13b50 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
13b60 67 65 72 2c 20 20 20 20 20 31 2c 20 30 2c 20 20  ger,     1, 0,  
13b70 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
13b80 7b 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 20  { OP_OpenRead,  
13b90 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 30    1, 2,        0
13ba0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
13bb0 77 69 6e 64 2c 20 20 20 20 20 20 31 2c 20 31 37  wind,      1, 17
13bc0 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
13bd0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
13be0 20 20 20 20 31 2c 20 33 2c 20 20 20 20 20 20 20      1, 3,       
13bf0 20 30 7d 2c 20 20 20 20 2f 2a 20 31 34 20 2a 2f   0},    /* 14 */
13c00 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
13c10 6e 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20  nsert,   1, 0,  
13c20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
13c30 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
13c40 20 20 31 2c 20 31 34 2c 20 20 20 20 20 20 20 30    1, 14,       0
13c50 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
13c60 74 65 67 72 69 74 79 43 6b 2c 20 31 2c 20 31 2c  tegrityCk, 1, 1,
13c70 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
13c80 2a 20 31 37 20 2a 2f 0a 20 20 20 20 20 20 7b 20  * 17 */.      { 
13c90 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
13ca0 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
13cb0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 71 6c 69  .    };.    sqli
13cc0 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
13cd0 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63 68 65  v, ArraySize(che
13ce0 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b  ckDb), checkDb);
13cf0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20  .  }else..  {}. 
13d00 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
13d10 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
13d20 28 7a 52 69 67 68 74 29 3b 0a 7d 0a              (zRight);.}.