/ Hex Artifact Content
Login

Artifact f13728865b6de5eb1ecc61827d334dc881ca1fb5:


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 32 38 20 32 30  ild.c,v 1.128 20
0310: 30 33 2f 30 32 2f 30 31 20 31 33 3a 35 33 3a 32  03/02/01 13:53:2
0320: 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  8 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 66 61 6b  ** This is a fak
0590: 65 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e callback proce
05a0: 64 75 72 65 20 75 73 65 64 20 77 68 65 6e 20 73  dure used when s
05b0: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 69 73 0a  qlite_exec() is.
05c0: 2a 2a 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  ** invoked with 
05d0: 61 20 4e 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 20  a NULL callback 
05e0: 70 6f 69 6e 74 65 72 2e 20 20 49 66 20 77 65 20  pointer.  If we 
05f0: 70 61 73 73 20 61 20 4e 55 4c 4c 20 63 61 6c 6c  pass a NULL call
0600: 62 61 63 6b 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  back.** pointer 
0610: 69 6e 74 6f 20 73 71 6c 69 74 65 56 64 62 65 45  into sqliteVdbeE
0620: 78 65 63 28 29 20 69 74 20 77 69 6c 6c 20 72 65  xec() it will re
0630: 74 75 72 6e 20 61 74 20 65 76 65 72 79 20 4f 50  turn at every OP
0640: 5f 43 61 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 77 68  _Callback,.** wh
0650: 69 63 68 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  ich we do not wa
0660: 6e 74 20 69 74 20 74 6f 20 64 6f 2e 20 20 53 6f  nt it to do.  So
0670: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61   we substitute a
0680: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
0690: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 69 6e  .** procedure in
06a0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 4e 55   place of the NU
06b0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
06c0: 74 20 66 61 6b 65 43 61 6c 6c 62 61 63 6b 28 76  t fakeCallback(v
06d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  oid *NotUsed, in
06e0: 74 20 6e 2c 20 63 68 61 72 20 2a 2a 61 7a 31 2c  t n, char **az1,
06f0: 20 63 68 61 72 20 2a 2a 61 7a 32 29 7b 0a 20 20   char **az2){.  
0700: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0720: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0730: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0740: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0750: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
0760: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
0770: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
0780: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0790: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
07a0: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
07b0: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
07c0: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
07d0: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
07e0: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
07f0: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0800: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0810: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0820: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
0830: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
0840: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0860: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0870: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0880: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0890: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
08a0: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
08b0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
08c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
08d0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
08e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
08f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
0900: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
0910: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
0920: 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68  d*,int,char**,ch
0930: 61 72 2a 2a 29 3b 0a 0a 20 20 69 66 28 20 73 71  ar**);..  if( sq
0940: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
0950: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  ed ) return;.  x
0960: 43 61 6c 6c 62 61 63 6b 20 3d 20 70 50 61 72 73  Callback = pPars
0970: 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  e->xCallback;.  
0980: 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 3d 3d 30  if( xCallback==0
0990: 20 26 26 20 70 50 61 72 73 65 2d 3e 75 73 65 43   && pParse->useC
09a0: 61 6c 6c 62 61 63 6b 20 29 20 78 43 61 6c 6c 62  allback ) xCallb
09b0: 61 63 6b 20 3d 20 66 61 6b 65 43 61 6c 6c 62 61  ack = fakeCallba
09c0: 63 6b 3b 0a 20 20 69 66 28 20 76 20 26 26 20 70  ck;.  if( v && p
09d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
09e0: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
09f0: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0a00: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0a10: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0a20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   0;.    sqliteVd
0a30: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
0a40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0a50: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 78 43  eMakeReady(v, xC
0a60: 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73 65 2d  allback, pParse-
0a70: 3e 70 41 72 67 2c 20 70 50 61 72 73 65 2d 3e 65  >pArg, pParse->e
0a80: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28  xplain);.    if(
0a90: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0aa0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66  back ){.      if
0ab0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
0ac0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
0ad0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74  = sqliteVdbeList
0ae0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  (v);.        db-
0af0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
0b00: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
0b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
0b30: 65 45 78 65 63 28 76 29 3b 0a 20 20 20 20 20 20  eExec(v);.      
0b40: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
0b50: 69 74 65 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  iteVdbeFinalize(
0b60: 76 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  v, &pParse->zErr
0b70: 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Msg);.      if( 
0b80: 72 63 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72  rc ) pParse->nEr
0b90: 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  r++;.      pPars
0ba0: 65 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20  e->pVdbe = 0;.  
0bb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0bc0: 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72   rc;.      if( r
0bd0: 63 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c ) pParse->nErr
0be0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
0bf0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0c00: 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f  = pParse->nErr ?
0c10: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
0c20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
0c30: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
0c40: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a  olNamesSet = 0;.
0c50: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65      pParse->sche
0c60: 6d 61 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a  maVerified = 0;.
0c70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
0c80: 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d  se->useCallback=
0c90: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
0ca0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0cb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
0cc0: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
0cd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
0ce0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
0cf0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0d00: 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Agg = 0;.}../*.*
0d10: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
0d20: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0d30: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0d40: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
0d50: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0d60: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0d70: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e  * of that table.
0d80: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
0d90: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54   not found..*/.T
0da0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64  able *sqliteFind
0db0: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
0dc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0dd0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
0de0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0df0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 74 62 6c 48  shFind(&db->tblH
0e00: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0e10: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0e20: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0e30: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
0e40: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
0e50: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
0e60: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
0e70: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
0e80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
0e90: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
0ea0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
0eb0: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
0ec0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  iteFindIndex(sql
0ed0: 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  ite *db, const c
0ee0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49  har *zName){.  I
0ef0: 6e 64 65 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  ndex *p;.  p = s
0f00: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0f10: 62 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  b->idxHash, zNam
0f20: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
0f30: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  +1);.  return p;
0f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
0f50: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
0f60: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
0f70: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
0f80: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
0f90: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
0fb0: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
0fc0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
0fd0: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
0fe0: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
0ff0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
1000: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
1010: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
1020: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
1030: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
1040: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1050: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1060: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
1070: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
1080: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
1090: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 61 73 73  dex *pOld;.  ass
10a0: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
10b0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
10c0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
10d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48  Insert(&db->idxH
10e0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
10f0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
1100: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
1110: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
1120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
1130: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
1140: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
1150: 65 2c 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e  e, strlen(pOld->
1160: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
1170: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
1180: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  e(p);.}../*.** U
1190: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
11a0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74  index from its t
11b0: 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76  able, then remov
11c0: 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66  e.** the index f
11d0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
11e0: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
11f0: 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e its memory.** 
1200: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
1210: 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b  oid sqliteUnlink
1220: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
1230: 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78  qlite *db, Index
1240: 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28   *pIndex){.  if(
1250: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1260: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
1270: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
1280: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
1290: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
12a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
12b0: 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  x *p;.    for(p=
12c0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
12d0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
12e0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
12f0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
1300: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
1310: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
1320: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
1330: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
1340: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1350: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1360: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
1370: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
1380: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
1390: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
13a0: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
13b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
13c0: 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  nection.  This r
13d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13e0: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
13f0: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
1400: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73   connection clos
1410: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
1420: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
1430: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
1440: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
1450: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
1460: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
1480: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
1490: 6d 61 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  ma(sqlite *db){.
14a0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
14b0: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
14c0: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 0a  .  Hash temp2;..
14d0: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
14e0: 72 28 26 64 62 2d 3e 61 46 4b 65 79 29 3b 0a 20  r(&db->aFKey);. 
14f0: 20 74 65 6d 70 31 20 3d 20 64 62 2d 3e 74 62 6c   temp1 = db->tbl
1500: 48 61 73 68 3b 0a 20 20 74 65 6d 70 32 20 3d 20  Hash;.  temp2 = 
1510: 64 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20  db->trigHash;.  
1520: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
1530: 64 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51  db->trigHash, SQ
1540: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
1550: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 48 61  , 0);.  sqliteHa
1560: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 69 64 78  shClear(&db->idx
1570: 48 61 73 68 29 3b 0a 20 20 66 6f 72 28 70 45 6c  Hash);.  for(pEl
1580: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
1590: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
15a0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
15b0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
15c0: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
15d0: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48  rigger = sqliteH
15e0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
15f0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
1600: 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72  Trigger(pTrigger
1610: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48  );.  }.  sqliteH
1620: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
1630: 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e  ;.  sqliteHashIn
1640: 69 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  it(&db->tblHash,
1650: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
1660: 49 4e 47 2c 20 30 29 3b 0a 20 20 66 6f 72 28 70  ING, 0);.  for(p
1670: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1680: 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45  irst(&temp1); pE
1690: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
16a0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
16b0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
16c0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
16d0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
16e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
16f0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 7d  e(db, pTab);.  }
1700: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
1710: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 64 62  ar(&temp1);.  db
1720: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c  ->flags &= ~(SQL
1730: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 7c  ITE_Initialized|
1740: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
1750: 6e 67 65 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nges);.}../*.** 
1760: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1770: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
1780: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1790: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  s.  If there wer
17a0: 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e  e.** schema chan
17b0: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
17c0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
17d0: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65   we have to rese
17e0: 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61  t the.** interna
17f0: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  l hash tables an
1800: 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72  d reload them fr
1810: 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64  om disk..*/.void
1820: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49   sqliteRollbackI
1830: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
1840: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66  qlite *db){.  if
1850: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
1860: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
1870: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
1880: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
1890: 65 6d 61 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  ema(db);.  }.}..
18a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
18c0: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
18d0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
18e0: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
18f0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
1900: 62 29 7b 0a 20 20 64 62 2d 3e 73 63 68 65 6d 61  b){.  db->schema
1910: 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 6e 65  _cookie = db->ne
1920: 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d  xt_cookie;.  db-
1930: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
1940: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
1950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
1960: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
1970: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
1980: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1990: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
19a0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
19b0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
19c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
19d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19e0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
19f0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
1a00: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
1a10: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
1a20: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
1a30: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
1a40: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
1a50: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
1a60: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
1a70: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
1a80: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
1a90: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
1aa0: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
1ab0: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
1ac0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
1ad0: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
1ae0: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
1af0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  able..**.** Indi
1b00: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
1b10: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72  ith the table ar
1b20: 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  e unlinked from 
1b30: 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61  the "db".** data
1b40: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62   structure if db
1b50: 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d  !=NULL.  If db==
1b60: 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74  NULL, indices at
1b70: 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65  tached to.** the
1b80: 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74   table are delet
1b90: 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73  ed, but it is as
1ba0: 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20  sumed they have 
1bb0: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20  already been.** 
1bc0: 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69  unlinked..*/.voi
1bd0: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61  d sqliteDeleteTa
1be0: 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ble(sqlite *db, 
1bf0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
1c00: 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78    int i;.  Index
1c10: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
1c20: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
1c30: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
1c40: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
1c50: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65  return;..  /* De
1c60: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
1c70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c80: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
1c90: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
1ca0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
1cb0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
1cc0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
1cd0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
1cf0: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
1d00: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
1d10: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
1d20: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
1d30: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
1d40: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
1d50: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
1d60: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
1d70: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
1d80: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
1d90: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
1da0: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
1db0: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
1dc0: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
1dd0: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
1de0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
1df0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e00: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46  HashFind(&db->aF
1e10: 4b 65 79 2c 70 46 4b 65 79 2d 3e 7a 54 6f 2c 73  Key,pFKey->zTo,s
1e20: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
1e30: 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20  )+1)!=pFKey );. 
1e40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46     sqliteFree(pF
1e50: 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Key);.  }..  /* 
1e60: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
1e70: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
1e80: 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  f..  */.  for(i=
1e90: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
1ea0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
1eb0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1ec0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
1ed0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1ee0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
1ef0: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
1f00: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
1f10: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20  ol[i].zType);.  
1f20: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
1f30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
1f40: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1f50: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  le->aCol);.  sql
1f60: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
1f70: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
1f80: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
1f90: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Table);.}../*.**
1fa0: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
1fb0: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
1fc0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
1fd0: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
1fe0: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
1ff0: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
2000: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
2010: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61  ign keys..*/.sta
2020: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55  tic void sqliteU
2030: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
2040: 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ble(sqlite *db, 
2050: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62  Table *p){.  Tab
2060: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65 79  le *pOld;.  FKey
2070: 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 61   *pF1, *pF2;.  a
2080: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
2090: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48    pOld = sqliteH
20a0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74  ashInsert(&db->t
20b0: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
20c0: 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d  , strlen(p->zNam
20d0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  e)+1, 0);.  asse
20e0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
20f0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28  Old==p );.  for(
2100: 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  pF1=p->pFKey; pF
2110: 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78  1; pF1=pF1->pNex
2120: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20  tFrom){.    int 
2130: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
2140: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
2150: 70 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73 68  pF2 = sqliteHash
2160: 46 69 6e 64 28 26 64 62 2d 3e 61 46 4b 65 79 2c  Find(&db->aFKey,
2170: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b   pF1->zTo, nTo);
2180: 0a 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46  .    if( pF2==pF
2190: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
21a0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
21b0: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
21c0: 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78  , nTo, pF1->pNex
21d0: 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tTo);.    }else{
21e0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46  .      while( pF
21f0: 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54  2 && pF2->pNextT
2200: 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46  o!=pF1 ){ pF2=pF
2210: 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20  2->pNextTo; }.  
2220: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
2230: 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78         pF2->pNex
2240: 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74  tTo = pF1->pNext
2250: 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  To;.      }.    
2260: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65  }.  }.  sqliteDe
2270: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29  leteTable(db, p)
2280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
2290: 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66  ruct the name of
22a0: 20 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72   a user table or
22b0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f   index from a to
22c0: 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ken..**.** Space
22d0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
22e0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
22f0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
2300: 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65  ) and must.** be
2310: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
2320: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2330: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54  */.char *sqliteT
2340: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
2350: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
2360: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
2370: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
2380: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
2390: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
23a0: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ote(zName);.  re
23b0: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
23c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23d0: 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61  de to open the a
23e0: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65  ppropriate maste
23f0: 72 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61  r table.  The ta
2400: 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69  ble.** opened wi
2410: 6c 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53  ll be SQLITE_MAS
2420: 54 45 52 20 66 6f 72 20 70 65 72 73 69 73 74 65  TER for persiste
2430: 6e 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a  nt tables and .*
2440: 2a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41  * SQLITE_TEMP_MA
2450: 53 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61  STER for tempora
2460: 72 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  ry tables.  The 
2470: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a  table is opened.
2480: 2a 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a  ** on cursor 0..
2490: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70  */.void sqliteOp
24a0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64  enMasterTable(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d  be *v, int isTem
24c0: 70 29 7b 0a 20 20 69 66 28 20 69 73 54 65 6d 70  p){.  if( isTemp
24d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
24e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
24f0: 65 6e 57 72 41 75 78 2c 20 30 2c 20 32 29 3b 0a  enWrAux, 0, 2);.
2500: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
2510: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 54 45  angeP3(v, -1, TE
2520: 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  MP_MASTER_NAME, 
2530: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  P3_STATIC);.  }e
2540: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  lse{.    sqliteV
2550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
2560: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32 29 3b  penWrite, 0, 2);
2570: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
2580: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 4d  hangeP3(v, -1, M
2590: 41 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53  ASTER_NAME, P3_S
25a0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  TATIC);.  }.}../
25b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
25c0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
25d0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
25e0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
25f0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
2600: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
2610: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
2620: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
2630: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
2640: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
2650: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
2660: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
2670: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2680: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
2690: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
26a0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
26b0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
26c0: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
26d0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
26e0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
26f0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
2700: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
2710: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
2720: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
2730: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
2740: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2750: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
2760: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
2770: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
2780: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
2790: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
27a0: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
27b0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
27c0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
27d0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
27e0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
27f0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
2800: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
2810: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
2820: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
2830: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
2840: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
2850: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2860: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
2870: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
2880: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
2890: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
28a0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
28b0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
28c0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
28d0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
28e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
28f0: 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  e sqliteEndTable
2900: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
2910: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
2920: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
2930: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
2940: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
2950: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72  .void sqliteStar
2960: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
2970: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
2980: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2990: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
29a0: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
29b0: 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f  E" token */.  To
29c0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
29d0: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
29e0: 6f 72 20 76 69 65 77 20 74 6f 20 63 72 65 61 74  or view to creat
29f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
2a00: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
2a10: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
2a20: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
2a30: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
2a40: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2a50: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
2a60: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
2a70: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
2a80: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
2a90: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
2aa0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
2ab0: 76 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46  v;..  pParse->sF
2ac0: 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74  irstToken = *pSt
2ad0: 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  art;.  zName = s
2ae0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
2af0: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
2b00: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
2b10: 20 72 65 74 75 72 6e 3b 0a 23 69 66 6e 64 65 66   return;.#ifndef
2b20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2b30: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
2b40: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
2b50: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2b60: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
2b70: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 29  ABLE(isTemp), 0)
2b80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
2b90: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
2ba0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7b 0a 20  eturn;.  }.  {. 
2bb0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
2bc0: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
2bd0: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
2be0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
2bf0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
2c00: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
2c10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c20: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
2c30: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
2c40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2c50: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
2c60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
2c70: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
2c80: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
2c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ca0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
2cb0: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
2cc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2cd0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
2ce0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
2cf0: 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
2d00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
2d10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2d20: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
2d30: 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20 42 65 66  ndif. ..  /* Bef
2d40: 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72  ore trying to cr
2d50: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
2d60: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72   table, make sur
2d70: 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a  e the Btree for.
2d80: 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d    ** holding tem
2d90: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73  porary tables is
2da0: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   open..  */.  if
2db0: 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e  ( isTemp && db->
2dc0: 70 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  pBeTemp==0 ){.  
2dd0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2de0: 65 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c  eBtreeOpen(0, 0,
2df0: 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d   MAX_PAGES, &db-
2e00: 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 69  >pBeTemp);.    i
2e10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e30: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
2e40: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61  e->zErrMsg, "una
2e50: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
2e60: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
2e70: 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
2e80: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
2e90: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20  porary tables", 
2ea0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
2eb0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
2ec0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2ed0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
2ee0: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
2ef0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2f00: 71 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54  qliteBtreeBeginT
2f10: 72 61 6e 73 28 64 62 2d 3e 70 42 65 54 65 6d 70  rans(db->pBeTemp
2f20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2f30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f40: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
2f50: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
2f60: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
2f70: 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
2f80: 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
2f90: 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
2fa0: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2fb0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
2fc0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
2fd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
2fe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ff0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
3000: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
3010: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
3020: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
3030: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
3040: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20   or table name. 
3050: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
3060: 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f  message if it do
3070: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  es..  **.  ** If
3080: 20 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69   we are re-readi
3090: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
30a0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
30b0: 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20  se of a schema. 
30c0: 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61   ** change and a
30d0: 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74   new permanent t
30e0: 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68  able is found wh
30f0: 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65  ose name collide
3100: 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65  s with.  ** an e
3110: 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72  xisting temporar
3120: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 67  y table, then ig
3130: 6e 6f 72 65 20 74 68 65 20 6e 65 77 20 70 65 72  nore the new per
3140: 6d 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  manent table..  
3150: 2a 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** We will conti
3160: 6e 75 65 20 70 61 72 73 69 6e 67 2c 20 62 75 74  nue parsing, but
3170: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d   the pParse->nam
3180: 65 43 6c 61 73 68 20 66 6c 61 67 20 77 69 6c 6c  eClash flag will
3190: 20 62 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20   be set.  ** so 
31a0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20  we will know to 
31b0: 64 69 73 63 61 72 64 20 74 68 65 20 74 61 62 6c  discard the tabl
31c0: 65 20 72 65 63 6f 72 64 20 6f 6e 63 65 20 70 61  e record once pa
31d0: 72 73 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68  rsing has finish
31e0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c  ed..  */.  pTabl
31f0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
3200: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ble(db, zName);.
3210: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
3220: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  ){.    if( pTabl
3230: 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61  e->isTemp && pPa
3240: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
3250: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
3260: 61 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20  ameClash = 1;.  
3270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
3280: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3290: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
32a0: 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70  , "table ", 0, p
32b0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
32c0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 61  n,.          " a
32d0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
32e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
32f0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3300: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3310: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
3320: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rn;.    }.  }els
3330: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e{.    pParse->n
3340: 61 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20  ameClash = 0;.  
3350: 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20  }.  if( (pIdx = 
3360: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
3370: 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26  db, zName))!=0 &
3380: 26 0a 20 20 20 20 20 20 20 20 20 20 28 21 70 49  &.          (!pI
3390: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65  dx->pTable->isTe
33a0: 6d 70 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69  mp || !pParse->i
33b0: 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  nitFlag) ){.    
33c0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
33d0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
33e0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
33f0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
3400: 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e  ed ", .       zN
3410: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
3420: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3430: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3440: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
3450: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
3460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
3470: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
3480: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
3490: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
34a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
34b0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
34c0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
34d0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
34e0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
34f0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
3500: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
3510: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
3520: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
3530: 73 54 65 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a  sTemp = isTemp;.
3540: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
3550: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
3560: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3570: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3580: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
3590: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
35a0: 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
35b0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
35c0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
35d0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
35e0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
35f0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
3600: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
3610: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
3620: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
3630: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
3640: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
3650: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
3660: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
3670: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
3680: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
3690: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
36a0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
36b0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
36c0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
36d0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
36e0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
36f0: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
3700: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
3710: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
3720: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
3730: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
3740: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
3750: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
3760: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
3770: 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76 20  >initFlag && (v 
3780: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
3790: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
37a0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
37b0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
37c0: 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  rse, 0, isTemp);
37d0: 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70  .    if( !isTemp
37e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
37f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3800: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c  Integer, db->fil
3810: 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  e_format, 0);.  
3820: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3830: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
3840: 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  kie, 0, 1);.    
3850: 7d 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  }.    sqliteOpen
3860: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69  MasterTable(v, i
3870: 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  sTemp);.    sqli
3880: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3890: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
38a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
38b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
38c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
38d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
38e0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
38f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
3900: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
3910: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
3920: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
3930: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
3940: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
3950: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
3960: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
3970: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3980: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
3990: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
39a0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
39b0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
39c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
39d0: 74 65 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  teStartTable() g
39e0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
39f0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
3a00: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
3a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3a20: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
3a30: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
3a40: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
3a50: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
3a60: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
3a70: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
3a80: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  t i;.  char *z =
3a90: 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
3aa0: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
3ab0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3ac0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
3ad0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
3ae0: 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  g(&z, pName->z, 
3af0: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
3b00: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
3b10: 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  n;.  sqliteDequo
3b20: 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30  te(z);.  for(i=0
3b30: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
3b40: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
3b50: 65 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61  eStrICmp(z, p->a
3b60: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
3b70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3b80: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
3b90: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 64 75 70  e->zErrMsg, "dup
3ba0: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
3bb0: 6d 65 3a 20 22 2c 20 7a 2c 20 30 29 3b 0a 20 20  me: ", z, 0);.  
3bc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3bd0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
3be0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  Free(z);.      r
3bf0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
3c00: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
3c10: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
3c20: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
3c30: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
3c40: 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c  Realloc( p->aCol
3c50: 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  , (p->nCol+8)*si
3c60: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
3c70: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
3c80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
3c90: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
3ca0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
3cb0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
3cc0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
3cd0: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
3ce0: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
3cf0: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f  zName = z;.  pCo
3d00: 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53  l->sortOrder = S
3d10: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
3d20: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
3d30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3d40: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3d50: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
3d60: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
3d70: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
3d80: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3d90: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
3da0: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
3db0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
3dc0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
3dd0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
3de0: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
3df0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
3e00: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
3e10: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
3e20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
3e30: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
3e40: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
3e50: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
3e60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
3e70: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
3e80: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
3e90: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
3ea0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
3eb0: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f   ) p->aCol[i].no
3ec0: 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b  tNull = onError;
3ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3ee0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3ef0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
3f00: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
3f10: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
3f20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
3f30: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
3f40: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
3f50: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
3f60: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
3f70: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
3f80: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
3f90: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
3fa0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
3fb0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
3fc0: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
3fd0: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
3fe0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
3ff0: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
4000: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
4010: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
4020: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
4030: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
4040: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
4050: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
4060: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
4070: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
4080: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
4090: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
40a0: 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c  First, Token *pL
40b0: 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ast){.  Table *p
40c0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
40d0: 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a  int n;.  char *z
40e0: 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  , **pz;.  Column
40f0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
4100: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
4110: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
4120: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
4130: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
4140: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
4150: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
4160: 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70  pz = &pCol->zTyp
4170: 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e  e;.  n = pLast->
4180: 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e  n + Addr(pLast->
4190: 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72 73 74  z) - Addr(pFirst
41a0: 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  ->z);.  sqliteSe
41b0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69  tNString(pz, pFi
41c0: 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20  rst->z, n, 0);. 
41d0: 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20   z = *pz;.  if( 
41e0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
41f0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d   for(i=j=0; z[i]
4200: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
4210: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66  c = z[i];.    if
4220: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
4230: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
4240: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
4250: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  [j] = 0;.  if( p
4260: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
4270: 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
4280: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
4290: 20 3d 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65   = sqliteCollate
42a0: 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 20 20 7d 65  Type(z, n);.  }e
42b0: 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  lse{.    pCol->s
42c0: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
42d0: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a  E_SO_NUM;.  }.}.
42e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e  ./*.** The given
42f0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65   token is the de
4300: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
4310: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
4320: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
4330: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
4340: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4350: 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c  on.  If "minusFl
4360: 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a  ag" is true, it.
4370: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c  ** means the val
4380: 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65  ue token was pre
4390: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
43a0: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   sign..**.** Thi
43b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
43c0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
43d0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
43e0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
43f0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
4400: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
4410: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 44  .void sqliteAddD
4420: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
4430: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4440: 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75   *pVal, int minu
4450: 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20  sFlag){.  Table 
4460: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
4470: 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20  har **pz;.  if( 
4480: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
4490: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
44a0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
44b0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
44c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d  ) return;.  pz =
44d0: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66   &p->aCol[i].zDf
44e0: 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46  lt;.  if( minusF
44f0: 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
4500: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
4510: 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c  "-", 1, pVal->z,
4520: 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pVal->n, 0);.  
4530: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4540: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
4550: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
4560: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
4570: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
4580: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
4590: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
45a0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
45b0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
45c0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
45d0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
45e0: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
45f0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
4600: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
4610: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
4620: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
4630: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
4640: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
4650: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
4660: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
4670: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
4680: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
4690: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
46a0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
46b0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
46c0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
46d0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
46e0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
46f0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
4700: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
4710: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
4720: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
4730: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
4740: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
4750: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
4760: 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65  e row id.  (Exce
4770: 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61  ption:.** For ba
4780: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
4790: 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
47a0: 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e   databases, do n
47b0: 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66  ot do this.** if
47c0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
47d0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
47e0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29  is less than 1.)
47f0: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
4800: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
4810: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
4820: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
4830: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
4840: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
4850: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
4860: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
4870: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
4880: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
4890: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
48a0: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
48b0: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
48c0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
48d0: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
48e0: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
48f0: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
4900: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
4910: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
4920: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
4930: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
4940: 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72 73  dPrimaryKey(Pars
4950: 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69 73  e *pParse, IdLis
4960: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e  t *pList, int on
4970: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
4980: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
4990: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
49a0: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
49b0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
49c0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
49d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61  eturn;.  if( pTa
49e0: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b  b->hasPrimKey ){
49f0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4a00: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4a10: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 5c 22  rrMsg, "table \"
4a20: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
4a30: 0a 20 20 20 20 20 20 20 20 22 5c 22 20 68 61 73  .        "\" has
4a40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
4a50: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 30 29 3b  rimary key", 0);
4a60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
4a70: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
4a80: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73  .  }.  pTab->has
4a90: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69  PrimKey = 1;.  i
4aa0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
4ab0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
4ac0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d 65 6c 73  nCol - 1;.  }els
4ad0: 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64  e if( pList->nId
4ae0: 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==1 ){.    for(i
4af0: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
4b00: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
4b10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
4b20: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
4b30: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[0].zName, pTab
4b40: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
4b50: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
4b60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4b70: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
4b80: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
4b90: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
4ba0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
4bb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
4bc0: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
4bd0: 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20 20  mat>=1 && .     
4be0: 20 20 20 20 20 20 7a 54 79 70 65 20 26 26 20 73        zType && s
4bf0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 79  qliteStrICmp(zTy
4c00: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
4c10: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
4c20: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
4c30: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
4c40: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73   onError;.  }els
4c50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 72 65  e{.    sqliteCre
4c60: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
4c70: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
4c80: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
4c90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
4ca0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
4cb0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65  e collating type
4cc0: 20 67 69 76 65 6e 20 61 20 74 79 70 65 20 6e 61   given a type na
4cd0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  me..**.** The co
4ce0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  llation type is 
4cf0: 74 65 78 74 20 28 53 51 4c 49 54 45 5f 53 4f 5f  text (SQLITE_SO_
4d00: 54 45 58 54 29 20 69 66 20 74 68 65 20 74 79 70  TEXT) if the typ
4d10: 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74 61 69  e.** name contai
4d20: 6e 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72  ns the character
4d30: 20 73 74 72 65 61 6d 20 22 74 65 78 74 22 20 6f   stream "text" o
4d40: 72 20 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22  r "blob" or.** "
4d50: 63 6c 6f 62 22 2e 20 20 41 6e 79 20 6f 74 68 65  clob".  Any othe
4d60: 72 20 74 79 70 65 20 6e 61 6d 65 20 69 73 20 63  r type name is c
4d70: 6f 6c 6c 61 74 65 64 20 61 73 20 6e 75 6d 65 72  ollated as numer
4d80: 69 63 0a 2a 2a 20 28 53 51 4c 49 54 45 5f 53 4f  ic.** (SQLITE_SO
4d90: 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _NUM)..*/.int sq
4da0: 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28  liteCollateType(
4db0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
4dc0: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
4dd0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4de0: 30 3b 20 69 3c 6e 54 79 70 65 2d 31 3b 20 69 2b  0; i<nType-1; i+
4df0: 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  +){.    switch( 
4e00: 7a 54 79 70 65 5b 69 5d 20 29 7b 0a 20 20 20 20  zType[i] ){.    
4e10: 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20 20 20    case 'b':.    
4e20: 20 20 63 61 73 65 20 27 42 27 3a 20 7b 0a 20 20    case 'B': {.  
4e30: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70        if( i<nTyp
4e40: 65 2d 33 20 26 26 20 73 71 6c 69 74 65 53 74 72  e-3 && sqliteStr
4e50: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c  NICmp(&zType[i],
4e60: 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a  "blob",4)==0 ){.
4e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4e80: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
4e90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4ea0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4eb0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 63 27  }.      case 'c'
4ec0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 43 27  :.      case 'C'
4ed0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4ee0: 69 3c 6e 54 79 70 65 2d 33 20 26 26 20 28 73 71  i<nType-3 && (sq
4ef0: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54  liteStrNICmp(&zT
4f00: 79 70 65 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29  ype[i],"char",4)
4f10: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70    sqliteStrNICmp
4f40: 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 6c 6f 62  (&zType[i],"clob
4f50: 22 2c 34 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ",4)==0).       
4f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4f70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
4f80: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EXT;.        }. 
4f90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4fb0: 20 27 78 27 3a 0a 20 20 20 20 20 20 63 61 73 65   'x':.      case
4fc0: 20 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'X': {.        
4fd0: 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c 69  if( i>=2 && sqli
4fe0: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70  teStrNICmp(&zTyp
4ff0: 65 5b 69 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29  e[i-2],"text",4)
5000: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5010: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5020: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20  O_TEXT;.        
5030: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
5040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
5050: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5080: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
5090: 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  M;.}../*.** This
50a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
50b0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
50c0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
50d0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
50e0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
50f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
5100: 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65  "COLLATE" clause
5110: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
5120: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
5130: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
5140: 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72  s the Column.sor
5150: 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65  tOrder on.** the
5160: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
5170: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
5180: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5190: 6c 69 74 65 41 64 64 43 6f 6c 6c 61 74 65 54 79  liteAddCollateTy
51a0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
51b0: 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b  , int collType){
51c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
51d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
51e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
51f0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
5200: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
5210: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
5220: 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72  ->aCol[i].sortOr
5230: 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a  der = collType;.
5240: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70  }../*.** Come up
5250: 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64   with a new rand
5260: 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  om value for the
5270: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20   schema cookie. 
5280: 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68   Make sure.** th
5290: 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64  e new value is d
52a0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
52b0: 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e old..**.** The
52c0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
52d0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
52e0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
52f0: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
5300: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
5310: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
5320: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
5330: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
5340: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
5350: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
5360: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
5370: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
5380: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
5390: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
53a0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
53b0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
53c0: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
53d0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
53e0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
53f0: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
5400: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
5410: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
5420: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
5430: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
5440: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
5450: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
5460: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
5470: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
5480: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
5490: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
54a0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
54b0: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
54c0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
54d0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
54e0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
54f0: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
5500: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
5510: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
5520: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
5530: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
5540: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
5550: 64 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f  d sqliteChangeCo
5560: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  okie(sqlite *db,
5570: 20 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28   Vdbe *v){.  if(
5580: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
5590: 3d 3d 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  ==db->schema_coo
55a0: 6b 69 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  kie ){.    db->n
55b0: 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ext_cookie = db-
55c0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b  >schema_cookie +
55d0: 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74   sqliteRandomByt
55e0: 65 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d  e() + 1;.    db-
55f0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5600: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5610: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5620: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5630: 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  r, db->next_cook
5640: 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ie, 0);.    sqli
5650: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5660: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20  P_SetCookie, 0, 
5670: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
5680: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
5690: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
56a0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
56b0: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
56c0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
56d0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
56e0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
56f0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
5700: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
5710: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
5720: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
5730: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
5740: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
5750: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
5760: 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20  needQuote = 0;. 
5770: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
5780: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
5790: 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b   *z=='\'' ){ n++
57a0: 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d  ; needQuote=1; }
57b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
57c0: 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d  + needQuote*2;.}
57d0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
57e0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
57f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5800: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
5810: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
5820: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
5830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5840: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
5850: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
5860: 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69  ar *zIdent){.  i
5870: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
5880: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
5890: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
58a0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
58b0: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
58c0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
58d0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
58e0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
58f0: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
5900: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
5910: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
5920: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
5930: 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65  qliteKeywordCode
5940: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
5950: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
5960: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
5970: 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  \'';.  for(j=0; 
5980: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
5990: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
59a0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
59b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27   zIdent[j]=='\''
59c0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
59d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
59e0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
59f0: 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20   '\'';.  z[i] = 
5a00: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
5a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5a20: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
5a30: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
5a40: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
5a50: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
5a60: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
5a70: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
5a80: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
5a90: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
5aa0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5ab0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5ac0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
5ad0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5ae0: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
5af0: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29  leStmt(Table *p)
5b00: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
5b10: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
5b20: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
5b30: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e  Sep2, *zEnd;.  n
5b40: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
5b50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
5b60: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
5b70: 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69  Length(p->aCol[i
5b80: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
5b90: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
5ba0: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
5bb0: 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<40 ){.    zS
5bc0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
5bd0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
5be0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
5bf0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
5c00: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
5c10: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
5c20: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
5c30: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
5c40: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
5c50: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
5c60: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
5c70: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
5c80: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
5c90: 74 2c 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 22  t, p->isTemp ? "
5ca0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
5cb0: 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41  E " : "CREATE TA
5cc0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
5cd0: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
5ce0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
5cf0: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
5d00: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
5d10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5d20: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
5d30: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
5d40: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
5d50: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
5d60: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
5d70: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
5d80: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
5d90: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
5da0: 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79  e);.  }.  strcpy
5db0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64  (&zStmt[k], zEnd
5dc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
5dd0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
5de0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5df0: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
5e00: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
5e10: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
5e20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5e30: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
5e40: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
5e50: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
5e60: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
5e70: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
5e80: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
5e90: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
5ea0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
5eb0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
5ec0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
5ed0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
5ee0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
5ef0: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
5f00: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a   table on disk,.
5f10: 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  ** unless this i
5f20: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
5f30: 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d  ble or initFlag=
5f40: 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46 6c  =1.  When initFl
5f50: 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61  ag==1,.** it mea
5f60: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
5f70: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
5f80: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
5f90: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
5fa0: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
5fb0: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
5fc0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
5fd0: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
5fe0: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
5ff0: 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  s, so the entry 
6000: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
6010: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
6020: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
6030: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
6040: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
6050: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
6060: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
6070: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
6080: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
6090: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
60a0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
60b0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
60c0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
60d0: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
60e0: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
60f0: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
6100: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
6110: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
6120: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
6130: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
6140: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
6150: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
6160: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50 61  qliteEndTable(Pa
6170: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
6180: 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74  en *pEnd, Select
6190: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
61a0: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
61b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
61c0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
61d0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
61e0: 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  ) || pParse->nEr
61f0: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
6200: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
6210: 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  rn;.  p = pParse
6220: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
6230: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
6240: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
6250: 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65  able is generate
6260: 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c  d from a SELECT,
6270: 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20   then construct 
6280: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66  the.  ** list of
6290: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
62a0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62   text of the tab
62b0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
62c0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61  Select ){.    Ta
62d0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73  ble *pSelTab = s
62e0: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
62f0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
6300: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
6310: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
6320: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73   return;.    ass
6330: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
6340: 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  );.    p->nCol =
6350: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
6360: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
6370: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
6380: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
6390: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
63a0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
63b0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
63c0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
63d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69  }..  /* If the i
63e0: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20  nitFlag is 1 it 
63f0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
6400: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
6410: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
6420: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
6430: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
6440: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
6450: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
6460: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
6470: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
6480: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
6490: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
64a0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
64b0: 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  om the pParse->n
64c0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
64d0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
64e0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
64f0: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
6500: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
6510: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
6520: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
6530: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
6540: 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73   p->tnum = pPars
6550: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
6560: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
6570: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
6580: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
6590: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
65a0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
65b0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
65c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
65d0: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
65e0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
65f0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
6600: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
6610: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
6620: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
6630: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
6640: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
6650: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
6660: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
6670: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
6680: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
6690: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
66a0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
66b0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
66c0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
66d0: 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d  dbe *v;..    v =
66e0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
66f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
6700: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
6710: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
6720: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
6730: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
6740: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6750: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6760: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20  CreateTable, 0, 
6770: 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  p->isTemp);.    
6780: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6790: 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
67a0: 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  r *)&p->tnum, P3
67b0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
67c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
67d0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   view */.      s
67e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
67f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6800: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
6810: 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  ->tnum = 0;.    
6820: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6830: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
6840: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
6860: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
6870: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
6880: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6890: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
68a0: 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33   -1, "table", P3
68b0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65  _STATIC);.    }e
68c0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
68d0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
68e0: 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f   -1, "view", P3_
68f0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
6900: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6910: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6920: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6930: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6940: 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  , -1, p->zName, 
6950: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6960: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6970: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
6980: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6990: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
69a0: 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  1, p->zName, P3_
69b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
69c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
69d0: 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20  OP_Dup, 4, 0);. 
69e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
69f0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6a00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6a10: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6a20: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
6a30: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
6a40: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
6a50: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
6a60: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6a70: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e  geP3(v, -1, z, n
6a80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6a90: 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(z);.    }els
6aa0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
6ab0: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
6ac0: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
6ad0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
6ae0: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
6af0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
6b00: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6b10: 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73  v, -1, pParse->s
6b20: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29  FirstToken.z, n)
6b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6b40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6b50: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
6b60: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6b70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6b80: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
6b90: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54  .    if( !p->isT
6ba0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
6bb0: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
6bc0: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
6bd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6be0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
6bf0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
6c00: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 69  elect ){.      i
6c10: 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54 65 6d  nt op = p->isTem
6c20: 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  p ? OP_OpenWrAux
6c30: 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   : OP_OpenWrite;
6c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6c50: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
6c60: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
6c70: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
6c80: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
6c90: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
6ca0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
6cb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
6cc0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
6cd0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6ce0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
6cf0: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
6d00: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
6d10: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
6d20: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
6d30: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
6d40: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30  se->nameClash==0
6d50: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   || pParse->init
6d60: 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
6d70: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
6d80: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
6d90: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 26 26 20 70  ameClash==0 && p
6da0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
6db0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
6dc0: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
6dd0: 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ey;.    pOld = s
6de0: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
6df0: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  &db->tblHash, p-
6e00: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
6e10: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
6e20: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
6e30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
6e40: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
6e50: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
6e60: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
6e70: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
6e80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6e90: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
6ea0: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
6eb0: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
6ec0: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
6ed0: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
6ee0: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
6ef0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
6f00: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 48 61 73  xtTo = sqliteHas
6f10: 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 4b 65 79  hFind(&db->aFKey
6f20: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
6f30: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
6f40: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
6f50: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
6f60: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
6f70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
6f80: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
6f90: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
6fa0: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
6fb0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
6fc0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
6fd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
6fe0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
6ff0: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
7000: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
7010: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
7020: 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  eCreateView(.  P
7030: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7040: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
7060: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
7070: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
7080: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
7090: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
70a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
70b0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  ,      /* The to
70c0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
70d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
70e0: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
70f0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
7100: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7110: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
7120: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
7130: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  */.  int isTemp 
7140: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
7150: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
7160: 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  view */.){.  Tab
7170: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
7180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
7190: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 0a  .  Token sEnd;..
71a0: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
71b0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
71c0: 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70  n, pName, isTemp
71d0: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
71e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
71f0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
7200: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
7210: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
7220: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
7230: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
7240: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
7250: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
7260: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
7270: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
7280: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
7290: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
72a0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
72b0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
72c0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
72d0: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
72e0: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
72f0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
7300: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
7310: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
7320: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
7330: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
7340: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
7350: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
7360: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7370: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
7380: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  t);.  sqliteSele
7390: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
73a0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
73b0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
73c0: 20 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43    sqliteViewGetC
73d0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
73e0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
73f0: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
7400: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
7410: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
7420: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
7430: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
7440: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
7450: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
7460: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
7470: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
7480: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
7490: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
74a0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
74b0: 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45  ;.  n = ((int)sE
74c0: 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65  nd.z) - (int)pBe
74d0: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42  gin->z;.  z = pB
74e0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
74f0: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
7500: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
7510: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
7520: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
7530: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
7540: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
7550: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
7560: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
7570: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
7580: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
7590: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
75a0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
75b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
75c0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
75d0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
75e0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
75f0: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
7600: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
7610: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
7620: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
7630: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
7640: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
7650: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
7660: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
7670: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
7680: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
7690: 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  re->zErrMsg..*/.
76a0: 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47 65  int sqliteViewGe
76b0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
76c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
76d0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78  e *pTable){.  Ex
76e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
76f0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
7700: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
7710: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
7720: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
7730: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
7740: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
7750: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
7760: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
7770: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
7780: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
7790: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
77a0: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
77b0: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
77c0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
77d0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
77e0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
77f0: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
7800: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
7810: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7820: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
7830: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
7840: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
7850: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
7860: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
7870: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
7880: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
7890: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
78a0: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
78b0: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
78c0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
78d0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
78e0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
78f0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
7900: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
7910: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
7920: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
7930: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
7940: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
7950: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
7960: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
7970: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
7980: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
7990: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
79a0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
79b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
79c0: 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20  rrMsg, "view ", 
79d0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20  pTable->zName,. 
79e0: 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69 72          " is cir
79f0: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
7a00: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
7a10: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
7a20: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
7a30: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
7a40: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
7a50: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
7a60: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
7a70: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
7a80: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
7a90: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
7aa0: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
7ab0: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
7ac0: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
7ad0: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
7ae0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
7af0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65  call to sqliteRe
7b00: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7b10: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
7b20: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
7b30: 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74  nts in this list
7b40: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e  .  But we will n
7b50: 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  eed to restore t
7b60: 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63  he list.  ** bac
7b70: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7b80: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
7b90: 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77  afterwards, so w
7ba0: 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66  e save a copy of
7bb0: 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e  .  ** the origin
7bc0: 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20  al in pEList..  
7bd0: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  */.  pEList = pS
7be0: 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53  el->pEList;.  pS
7bf0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  el->pEList = sql
7c00: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
7c10: 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53  EList);.  if( pS
7c20: 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b  el->pEList==0 ){
7c30: 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  .    pSel->pELis
7c40: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
7c50: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61  return 1;  /* Ma
7c60: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
7c70: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   }.  pTable->nCo
7c80: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
7c90: 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74  b = sqliteResult
7ca0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
7cb0: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
7cc0: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
7cd0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
7ce0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
7cf0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
7d00: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
7d10: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
7d20: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
7d30: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
7d40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
7d50: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
7d60: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
7d70: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
7d80: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  );.    pParse->d
7d90: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
7da0: 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  TE_UnresetViews;
7db0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
7dc0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
7dd0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
7de0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e    sqliteSelectUn
7df0: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
7e00: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
7e10: 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29  te(pSel->pEList)
7e20: 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ;.  pSel->pEList
7e30: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74   = pEList;.  ret
7e40: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
7e50: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
7e60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
7e70: 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65   the VIEW pTable
7e80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7e90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
7ea0: 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65  henever any othe
7eb0: 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  r table or view 
7ec0: 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20  is modified..** 
7ed0: 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20  The view passed 
7ee0: 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
7ef0: 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64  e might depend d
7f00: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
7f10: 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20  ectly.** on the 
7f20: 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65  modified or dele
7f30: 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20  ted table so we 
7f40: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
7f50: 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  e old column.** 
7f60: 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68  names so that th
7f70: 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d  ey will be recom
7f80: 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
7f90: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
7fa0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
7fb0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
7fc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7fd0: 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61  pTable==0 || pTa
7fe0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ble->pSelect==0 
7ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
8000: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20  pTable->nCol==0 
8010: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8020: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
8030: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
8040: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
8050: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8070: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
8080: 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  .zDflt);.    sql
8090: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
80a0: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a  aCol[i].zType);.
80b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
80c0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
80d0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
80e0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43   0;.  pTable->nC
80f0: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
8100: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8110: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
8120: 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69 64  ry VIEW..*/.void
8130: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
8140: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  All(sqlite *db){
8150: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
8160: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8170: 20 26 20 53 51 4c 49 54 45 5f 55 6e 72 65 73 65   & SQLITE_Unrese
8180: 74 56 69 65 77 73 29 3d 3d 30 20 29 20 72 65 74  tViews)==0 ) ret
8190: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
81a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
81b0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ->tblHash); i; i
81c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
81d0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
81e0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
81f0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
8200: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
8210: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
8220: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
8230: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
8240: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
8250: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65   &= ~SQLITE_Unre
8260: 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a  setViews;.}../*.
8270: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
8280: 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c  , look up a tabl
8290: 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65  e with that name
82a0: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
82b0: 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72   leave.** an err
82c0: 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  or for the parse
82d0: 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65  r to find and re
82e0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61  turn NULL..*/.Ta
82f0: 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65  ble *sqliteTable
8300: 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20  FromToken(Parse 
8310: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8320: 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a  pTok){.  char *z
8330: 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70  Name;.  Table *p
8340: 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  Tab;.  zName = s
8350: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
8360: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20  omToken(pTok);. 
8370: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
8380: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62  return 0;.  pTab
8390: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
83a0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
83b0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
83c0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
83d0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
83e0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
83f0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8400: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
8410: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
8420: 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b     pTok->z, pTok
8430: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
8440: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  rse->nErr++;.  }
8450: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
8460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8470: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8480: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
8490: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
84a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
84b0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
84c0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
84d0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
84e0: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62  id sqliteDropTab
84f0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
8500: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8510: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
8520: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
8530: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62  Vdbe *v;.  int b
8540: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ase;.  sqlite *d
8550: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8560: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8570: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
8580: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
8590: 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d  turn;.  pTable =
85a0: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
85b0: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e  Token(pParse, pN
85c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
85d0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
85e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
85f0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
8600: 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  N.  if( sqliteAu
8610: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
8620: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53  SQLITE_DELETE, S
8630: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
8640: 6c 65 2d 3e 69 73 54 65 6d 70 29 2c 30 29 29 7b  le->isTemp),0)){
8650: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8660: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
8670: 65 3b 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  e;.    if( isVie
8680: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  w ){.      if( p
8690: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b  Table->isTemp ){
86a0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
86b0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
86c0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
86d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
86e0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
86f0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
8700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
8710: 28 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  ( pTable->isTemp
8720: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
8730: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
8740: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
8750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8760: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
8770: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
8780: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8790: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
87a0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
87b0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20  able->zName, 0) 
87c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
87d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
87e0: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
87f0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
8800: 4c 45 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  LETE, pTable->zN
8810: 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
8820: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8830: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8840: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
8850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
8860: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
8870: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
8880: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
8890: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
88a0: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
88b0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
88c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
88d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
88e0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65  isView && pTable
88f0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
8900: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
8910: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8920: 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20  rMsg, "use DROP 
8930: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
8940: 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70  table ",.      p
8950: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
8960: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
8970: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
8980: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
8990: 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70  iew && pTable->p
89a0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
89b0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
89c0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
89d0: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
89e0: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 22 2c  o delete view ",
89f0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a  .      pTable->z
8a00: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
8a10: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8a20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
8a30: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
8a40: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
8a50: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
8a60: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
8a70: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
8a80: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
8a90: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
8aa0: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
8ab0: 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62  c VdbeOp dropTab
8ac0: 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  le[] = {.      {
8ad0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
8ae0: 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c  0, ADDR(8),  0},
8af0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
8b00: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
8b10: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f       0}, /* 1 */
8b20: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
8b30: 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
8b40: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
8b50: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
8b60: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
8b70: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
8b80: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
8b90: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
8ba0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
8bb0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
8bc0: 37 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  7),  0},.      {
8bd0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
8be0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
8bf0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
8c00: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
8c10: 33 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f  3),  0}, /* 7 */
8c20: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65  .    };.    Inde
8c30: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69  x *pIdx;.    Tri
8c40: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
8c50: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
8c60: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8c70: 61 72 73 65 2c 20 30 2c 20 70 54 61 62 6c 65 2d  arse, 0, pTable-
8c80: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  >isTemp);.    sq
8c90: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
8ca0: 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69  ble(v, pTable->i
8cb0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 2f 2a 20 44  sTemp);.    /* D
8cc0: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
8cd0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8ce0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
8cf0: 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20   dropped */.    
8d00: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c  pTrigger = pTabl
8d10: 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  e->pTrigger;.   
8d20: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
8d30: 20 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20   ){.      Token 
8d40: 74 74 3b 0a 20 20 20 20 20 20 74 74 2e 7a 20 3d  tt;.      tt.z =
8d50: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
8d60: 72 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 74  r->name;.      t
8d70: 74 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61  t.n = strlen(pTa
8d80: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e  ble->pTrigger->n
8d90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
8da0: 74 65 44 72 6f 70 54 72 69 67 67 65 72 28 70 50  teDropTrigger(pP
8db0: 61 72 73 65 2c 20 26 74 74 2c 20 31 29 3b 0a 20  arse, &tt, 1);. 
8dc0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
8dd0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
8de0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
8df0: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
8e00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8e10: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
8e20: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
8e30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e40: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
8e50: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
8e60: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
8e70: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
8e80: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  e);.    sqliteVd
8e90: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
8ea0: 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  se+1, pTable->zN
8eb0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
8ec0: 20 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70   !pTable->isTemp
8ed0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ee0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
8ef0: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
8f00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8f10: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
8f20: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
8f30: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
8f40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8f50: 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c  P_Destroy, pTabl
8f60: 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d  e->tnum, pTable-
8f70: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  >isTemp);.      
8f80: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
8f90: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
8fa0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
8fb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8fc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8fd0: 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74  Destroy, pIdx->t
8fe0: 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54  num, pTable->isT
8ff0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  emp);.      }.  
9000: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
9010: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
9020: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
9030: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
9040: 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
9050: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
9060: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65  ..  **.  ** Exce
9070: 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51  ption: if the SQ
9080: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61  L statement bega
9090: 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41  n with the EXPLA
90a0: 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a  IN keyword,.  **
90b0: 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   then no changes
90c0: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e   should be made.
90d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
90e0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
90f0: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
9100: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
9110: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
9120: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
9130: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
9140: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  s;.  }.  sqliteV
9150: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 29 3b  iewResetAll(db);
9160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9170: 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74  outine construct
9180: 73 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75  s a P3 string su
9190: 69 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50  itable for an OP
91a0: 5f 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f  _MakeIdxKey.** o
91b0: 70 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74  pcode and adds t
91c0: 68 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f  hat P3 string to
91d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
91e0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
91f0: 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruction.** in th
9200: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
9210: 65 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e  e.  The P3 strin
9220: 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  g consists of a 
9230: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
9240: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  .** for each col
9250: 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78  umn in the index
9260: 20 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70   pIdx of table p
9270: 54 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c  Tab.  If the col
9280: 75 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75  umn uses.** a nu
9290: 6d 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72  meric sort order
92a0: 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74  , then the P3 st
92b0: 72 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63  ring character c
92c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a  orresponding to.
92d0: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  ** that column i
92e0: 73 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63  s 'n'.  If the c
92f0: 6f 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78  olumn uses a tex
9300: 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68  t sort order, th
9310: 65 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72  en the.** P3 str
9320: 69 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65  ing is 't'.  See
9330: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b   the OP_MakeIdxK
9340: 65 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65  ey opcode docume
9350: 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  ntation for.** a
9360: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
9370: 61 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f  ation.  See also
9380: 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65   the sqliteAddKe
9390: 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e  yType() routine.
93a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
93b0: 64 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62  ddIdxKeyType(Vdb
93c0: 65 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64  e *v, Index *pId
93d0: 78 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  x){.  char *zTyp
93e0: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
93f0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
9400: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
9410: 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21  && pIdx->pTable!
9420: 3d 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70  =0 );.  pTab = p
9430: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e  Idx->pTable;.  n
9440: 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
9450: 3b 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69  ;.  zType = sqli
9460: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31  teMallocRaw( n+1
9470: 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d   );.  if( zType=
9480: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
9490: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
94a0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
94b0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
94c0: 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
94d0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
94e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
94f0: 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43     if( (pTab->aC
9500: 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64  ol[iCol].sortOrd
9510: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
9520: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
9530: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
9540: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27    zType[i] = 't'
9550: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9560: 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e     zType[i] = 'n
9570: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ';.    }.  }.  z
9580: 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73  Type[n] = 0;.  s
9590: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
95a0: 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20  3(v, -1, zType, 
95b0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  n);.  sqliteFree
95c0: 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (zType);.}../*.*
95d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
95e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
95f0: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
9600: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
9610: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
9620: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9630: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
9640: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
9650: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
9660: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
9670: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
9680: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
9690: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
96a0: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
96b0: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
96c0: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
96d0: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
96e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
96f0: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
9700: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
9710: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
9720: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
9730: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
9740: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
9750: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
9760: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
9770: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
9780: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
9790: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
97a0: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
97b0: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
97c0: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
97d0: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
97e0: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
97f0: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
9800: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
9810: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
9820: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
9830: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
9840: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
9850: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
9860: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
9870: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
9880: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
9890: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
98a0: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
98b0: 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  il sqliteEndTabl
98c0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
98d0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
98e0: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
98f0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
9900: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
9910: 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65 72  * to sqliteDefer
9920: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
9930: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
9940: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
9950: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
9960: 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
9970: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9980: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9990: 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73  ntext */.  IdLis
99a0: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20  t *pFromCol,    
99b0: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
99c0: 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
99d0: 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
99e0: 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
99f0: 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
9a00: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
9a10: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c  r table */.  IdL
9a20: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
9a30: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
9a40: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
9a50: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
9a70: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
9a80: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
9a90: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
9aa0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9ab0: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
9ac0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
9ad0: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
9ae0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
9af0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  0;..  assert( pT
9b00: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
9b10: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
9b20: 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  rr ) goto fk_end
9b30: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
9b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
9b50: 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
9b60: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
9b70: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
9b80: 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
9b90: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20   pToCol->nId!=1 
9ba0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
9bb0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
9bc0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f 72  e->zErrMsg, "for
9bd0: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20 2d  eign key on ", -
9be0: 31 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  1,.         p->a
9bf0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
9c00: 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 22   -1, .         "
9c10: 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
9c20: 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
9c30: 6e 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d 31  n of table ", -1
9c40: 2c 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  ,.         pTo->
9c50: 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20  z, pTo->n, 0);. 
9c60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
9c70: 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r++;.      goto 
9c80: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
9c90: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
9ca0: 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
9cb0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70  & pToCol->nId!=p
9cc0: 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a  FromCol->nId ){.
9cd0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9ce0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9cf0: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22  rMsg, .        "
9d00: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9d10: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
9d20: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9d30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
9d40: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
9d50: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
9d60: 65 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a 20  ed table", 0);. 
9d70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9d80: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  +;.    goto fk_e
9d90: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
9da0: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
9db0: 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79  ->nId;.  }.  nBy
9dc0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
9dd0: 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
9de0: 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
9df0: 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
9e00: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
9e10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9e20: 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ToCol->nId; i++)
9e30: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
9e40: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
9e50: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
9e60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
9e70: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
9e80: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
9e90: 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
9ea0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
9eb0: 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
9ec0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
9ed0: 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
9ee0: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
9ef0: 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
9f00: 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
9f10: 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
9f20: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
9f30: 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
9f40: 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
9f50: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
9f60: 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
9f70: 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
9f80: 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
9f90: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
9fa0: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
9fb0: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
9fc0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
9fd0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
9fe0: 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
9ff0: 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
a000: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
a010: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
a020: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
a030: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
a040: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
a050: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
a060: 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
a070: 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
a080: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
a090: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
a0a0: 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
a0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
a0c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a0d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
a0e0: 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
a0f0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
a100: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
a110: 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20  rrMsg, "unknown 
a120: 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20 20  column \"", .   
a130: 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
a140: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22  >a[i].zName, "\"
a150: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
a160: 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29 3b  definition", 0);
a170: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
a180: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
a190: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
a1a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a1b0: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
a1c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a1d0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
a1e0: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
a1f0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
a200: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
a210: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
a220: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
a230: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
a240: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
a250: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
a260: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
a270: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
a280: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
a290: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
a2a0: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
a2b0: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
a2c0: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
a2d0: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
a2e0: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
a2f0: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
a300: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
a310: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
a320: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
a330: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
a340: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
a350: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
a360: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
a370: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
a380: 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69  e(pFKey);.  sqli
a390: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
a3a0: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
a3b0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
a3c0: 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
a3d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a3e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
a3f0: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
a400: 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
a410: 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
a420: 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
a430: 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
a440: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
a450: 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
a460: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
a470: 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
a480: 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
a490: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
a4a0: 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
a4b0: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
a4c0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
a4d0: 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
a4e0: 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
a4f0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
a500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65  .void sqliteDefe
a510: 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
a520: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
a530: 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61  sDeferred){.  Ta
a540: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
a550: 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
a560: 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
a570: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
a580: 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
a590: 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
a5a0: 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
a5b0: 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
a5c0: 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rred;.}../*.** C
a5d0: 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
a5e0: 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
a5f0: 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
a600: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
a610: 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
a620: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
a630: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
a640: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
a650: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
a660: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
a670: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
a680: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
a690: 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
a6a0: 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
a6b0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
a6c0: 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
a6d0: 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
a6e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a6f0: 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
a700: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
a710: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
a720: 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
a730: 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
a740: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
a750: 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
a760: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a770: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
a780: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
a790: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
a7a0: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
a7b0: 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
a7c0: 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
a7d0: 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
a7e0: 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
a7f0: 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
a800: 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
a810: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
a820: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
a830: 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
a840: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
a850: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
a860: 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  se,   /* All inf
a870: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a880: 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
a890: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
a8a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
a8b0: 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55  ndex.  May be NU
a8c0: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
a8d0: 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  Table,   /* Name
a8e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
a8f0: 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61   index.  Use pPa
a900: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
a910: 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  f 0 */.  IdList 
a920: 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
a930: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
a940: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
a950: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
a960: 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
a970: 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
a980: 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
a990: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
a9a0: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43  tart,   /* The C
a9b0: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
a9c0: 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45   begins a CREATE
a9d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a9e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
a9f0: 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29  d      /* The ")
aa00: 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
aa10: 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
aa20: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
aa30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
aa40: 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
aa50: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
aa60: 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f  dex *pIndex;   /
aa70: 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
aa80: 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
aa90: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
aaa0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
aab0: 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20  ken nullId;     
aac0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
aad0: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
aae0: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
aaf0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
ab00: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68  rse->db;.  int h
ab10: 69 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  ideName = 0;    
ab20: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70       /* Do not p
ab30: 75 74 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  ut table name in
ab40: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
ab50: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
ab60: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
ab70: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
ab80: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
ab90: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
aba0: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
abb0: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
abc0: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
abd0: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
abe0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
abf0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
ac00: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
ac10: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
ac20: 20 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f    sqliteTableFro
ac30: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  mToken(pParse, p
ac40: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Table);.  }else{
ac50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
ac60: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
ac70: 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
ac80: 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
ac90: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
aca0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
acb0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
acc0: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
acd0: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
ace0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
acf0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
ad00: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
ad10: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
ad20: 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e  " may not have n
ad30: 65 77 20 69 6e 64 69 63 65 73 20 61 64 64 65 64  ew indices added
ad40: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
ad50: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
ad60: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
ad70: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
ad80: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
ad90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
ada0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
adb0: 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73 20 6d  ErrMsg, "views m
adc0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
add0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
ade0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
adf0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ae00: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
ae10: 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
ae20: 69 73 20 63 72 65 61 74 65 64 20 77 68 69 6c 65  is created while
ae30: 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20   re-reading the 
ae40: 73 63 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69  schema from sqli
ae50: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62  te_master.  ** b
ae60: 75 74 20 74 68 65 20 74 61 62 6c 65 20 61 73 73  ut the table ass
ae70: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
ae80: 73 20 69 6e 64 65 78 20 69 73 20 61 20 74 65 6d  s index is a tem
ae90: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 69 74  porary table, it
aea0: 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d   can.  ** only m
aeb0: 65 61 6e 20 74 68 61 74 20 74 68 65 20 74 61 62  ean that the tab
aec0: 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  le that this ind
aed0: 65 78 20 69 73 20 72 65 61 6c 6c 79 20 61 73 73  ex is really ass
aee0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 73 0a  ociated with is.
aef0: 20 20 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e    ** one whose n
af00: 61 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62 65  ame is hidden be
af10: 68 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72 79  hind a temporary
af20: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
af30: 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  same name..  ** 
af40: 53 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65 20  Since its table 
af50: 68 61 73 20 62 65 65 6e 20 73 75 70 70 72 65 73  has been suppres
af60: 73 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  sed, we need to 
af70: 61 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74 68  also suppress th
af80: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20  e.  ** index..  
af90: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
afa0: 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 21 70 50  >initFlag && !pP
afb0: 61 72 73 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  arse->isTemp && 
afc0: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  pTab->isTemp ){.
afd0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
afe0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
aff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
b000: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b010: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
b020: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
b030: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
b040: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
b050: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
b060: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
b070: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
b080: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
b090: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
b0a0: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
b0b0: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
b0c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b0d0: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
b0e0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
b0f0: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
b100: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
b110: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
b120: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
b130: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
b140: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
b150: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
b160: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
b170: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
b180: 69 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77 65  is index, but we
b190: 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 73   will not.  ** s
b1a0: 74 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69 6e  tore its name in
b1b0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
b1c0: 20 20 53 65 74 20 74 68 65 20 68 69 64 65 4e 61    Set the hideNa
b1d0: 6d 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f 6d  me flag to accom
b1e0: 70 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73 2e  plish.  ** this.
b1f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
b200: 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
b210: 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
b220: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
b230: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
b240: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
b250: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
b260: 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
b270: 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
b280: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
b290: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
b2a0: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
b2b0: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
b2c0: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
b2d0: 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
b2e0: 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
b2f0: 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
b300: 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
b310: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
b320: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
b330: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
b340: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
b350: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
b360: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
b370: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
b380: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
b390: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b  b, zName))!=0 ){
b3a0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 53 61 6d  .      if( pISam
b3b0: 65 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e 69  eName->pTable->i
b3c0: 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d  sTemp && pParse-
b3d0: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
b3e0: 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20       hideName = 
b3f0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
b400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
b410: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
b420: 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  >zErrMsg, "index
b430: 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20   ", zName, .    
b440: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
b450: 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20   exists", 0);.  
b460: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
b470: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f  rr++;.        go
b480: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b490: 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
b4a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53    }.    if( (pTS
b4b0: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
b4c0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
b4d0: 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
b4e0: 20 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d 65    if( pTSameName
b4f0: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72  ->isTemp && pPar
b500: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
b510: 20 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65          hideName
b520: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
b530: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b540: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b550: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68  se->zErrMsg, "th
b560: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
b570: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a   table named ",.
b580: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b590: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
b5a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
b5b0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
b5c0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
b5d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
b5e0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
b5f0: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
b600: 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
b610: 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
b620: 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
b630: 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
b640: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
b650: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
b660: 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e  ntf(zBuf,"%d)",n
b670: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
b680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
b690: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28  tring(&zName, "(
b6a0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
b6b0: 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a  " autoindex ", z
b6c0: 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Buf, 0);.    if(
b6d0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
b6e0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
b6f0: 65 78 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d 65  ex;.    hideName
b700: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
b710: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d 30  ex(db, zName)!=0
b720: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
b730: 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
b740: 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
b750: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
b760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b770: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
b780: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
b790: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
b7a0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
b7b0: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69  MA_TABLE(pTab->i
b7c0: 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a 20 20  sTemp), 0) ){.  
b7d0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
b7e0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
b7f0: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
b800: 45 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28 20 70  E_INDEX;.  if( p
b810: 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 20 69 20  Tab->isTemp ) i 
b820: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
b830: 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 69 66  TEMP_INDEX;.  if
b840: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
b850: 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
b860: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  me, pTab->zName)
b870: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
b880: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
b890: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
b8a0: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
b8b0: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
b8c0: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
b8d0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
b8e0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
b8f0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
b900: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
b910: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
b920: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
b930: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
b940: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
b950: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
b960: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
b970: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
b980: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
b990: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
b9a0: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
b9b0: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
b9c0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
b9d0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
b9e0: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
b9f0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
ba00: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ba10: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
ba20: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
ba30: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
ba40: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
ba50: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ba60: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
ba70: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
ba80: 31 20 2b 0a 20 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 73 69 7a 65              size
baa0: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
bab0: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
bac0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
bad0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bae0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
baf0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
bb00: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
bb10: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
bb20: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
bb30: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
bb40: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
bb50: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
bb60: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
bb70: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
bb80: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
bb90: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
bba0: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
bbb0: 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f  ex->isUnique = o
bbc0: 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
bbd0: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
bbe0: 61 6d 65 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 63  ame==0;..  /* Sc
bbf0: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
bc00: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
bc10: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
bc20: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
bc30: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
bc40: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
bc50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
bc60: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
bc70: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
bc80: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
bc90: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
bca0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
bcb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
bcc0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
bcd0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
bce0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
bcf0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
bd00: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
bd10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
bd20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
bd30: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
bd40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bd50: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
bd60: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
bd70: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
bd80: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68 61  e, .        " ha
bd90: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
bda0: 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  d ", pList->a[i]
bdb0: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
bdc0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
bdd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
bde0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
bdf0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
be00: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
be10: 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
be20: 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d  lumn[i] = j;.  }
be30: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
be40: 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
be50: 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
be60: 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
be70: 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
be80: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
be90: 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
bea0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
beb0: 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65 20  in && !hideName 
bec0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
bed0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
bee0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69  ashInsert(&db->i
bef0: 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e  dxHash, pIndex->
bf00: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
bf10: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
bf20: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
bf30: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
bf40: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
bf50: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
bf60: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
bf70: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
bf80: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
bf90: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bfa0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
bfb0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
bfc0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
bfd0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
bfe0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
bff0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
c000: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
c010: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
c020: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
c030: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
c040: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
c050: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
c060: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
c070: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
c080: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
c090: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
c0a0: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
c0b0: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
c0c0: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
c0d0: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
c0e0: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
c0f0: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
c100: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
c110: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
c120: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
c130: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
c140: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
c150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
c160: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
c170: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
c180: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
c190: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
c1a0: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
c1b0: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
c1c0: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
c1d0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
c1e0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
c1f0: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
c200: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
c210: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
c220: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
c230: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
c240: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
c250: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
c260: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
c270: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
c280: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
c290: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
c2a0: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
c2b0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
c2c0: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
c2d0: 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  r from the pPars
c2e0: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
c2f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
c300: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
c310: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
c320: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
c330: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
c340: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c350: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
c360: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
c370: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
c380: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
c390: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
c3a0: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
c3b0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
c3c0: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
c3d0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
c3e0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
c3f0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
c400: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
c410: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
c420: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
c430: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
c440: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
c450: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
c460: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
c470: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
c480: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
c490: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
c4a0: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
c4b0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
c4c0: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
c4d0: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
c4e0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
c4f0: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
c500: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
c510: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
c520: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
c530: 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d  .  ** If pTable=
c540: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
c550: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
c560: 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
c570: 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
c580: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
c590: 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
c5a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
c5b0: 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
c5c0: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
c5d0: 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
c5e0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
c5f0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
c600: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
c610: 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
c620: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
c630: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
c640: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
c650: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
c660: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
c670: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
c680: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
c690: 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d      int isTemp =
c6a0: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a   pTab->isTemp;..
c6b0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
c6c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c6d0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
c6e0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c6f0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
c700: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
c710: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
c720: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
c730: 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  e, 0, isTemp);. 
c740: 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d       sqliteOpenM
c750: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73  asterTable(v, is
c760: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Temp);.    }.   
c770: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c780: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
c790: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c7a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c7b0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
c7c0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
c7d0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
c7e0: 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
c7f0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  C);.    sqliteVd
c800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
c810: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
c820: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
c830: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65  eP3(v, -1, pInde
c840: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
c850: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
c860: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c870: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
c880: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c890: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
c8a0: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
c8b0: 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  TIC);.    addr =
c8c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c8d0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
c8e0: 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  ex, 0, isTemp);.
c8f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
c900: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
c910: 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
c920: 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52  tnum, P3_POINTER
c930: 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  );.    pIndex->t
c940: 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  num = 0;.    if(
c950: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
c960: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c970: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
c980: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
c990: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
c9a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c9b0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 2c 20  , OP_OpenWrAux, 
c9c0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 0);.      }el
c9d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
c9e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c9f0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
ca00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ca10: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  }.    addr = sql
ca20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ca30: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
ca40: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
ca50: 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
ca60: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
ca70: 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74 61 72  >z) - Addr(pStar
ca80: 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  t->z) + 1;.     
ca90: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
caa0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74  eP3(v, addr, pSt
cab0: 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20  art->z, n);.    
cac0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
cad0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
cae0: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
caf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cb00: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
cb10: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ey, 0, 0);.    i
cb20: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
cb30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cb40: 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f  Op(v, isTemp ? O
cb50: 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f  P_OpenAux : OP_O
cb60: 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  pen, 2, pTab->tn
cb70: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
cb80: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
cb90: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
cba0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
cbb0: 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74      lbl2 = sqlit
cbc0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
cbd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
cbe0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
cbf0: 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b  ewind, 2, lbl2);
cc00: 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
cc10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cc20: 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29   OP_Recno, 2, 0)
cc30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
cc40: 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
cc50: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
cc60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cc70: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
cc80: 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  2, pIndex->aiCol
cc90: 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  umn[i]);.      }
cca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ccb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
ccc0: 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d  eIdxKey, pIndex-
ccd0: 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >nColumn, 0);.  
cce0: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65      if( db->file
ccf0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c  _format>=4 ) sql
cd00: 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70 65  iteAddIdxKeyType
cd10: 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  (v, pIndex);.   
cd20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cd30: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c  Op(v, OP_IdxPut,
cd40: 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   1, pIndex->onEr
cd50: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20  ror!=OE_None);. 
cd60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
cd70: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
cd80: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
cd90: 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
cda0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
cdb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cdc0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
cdd0: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
cde0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
cdf0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a  Label(v, lbl2);.
ce00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ce10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
ce20: 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 2, 0);.      
ce30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ce40: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
ce50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
ce60: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
ce70: 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70       if( !isTemp
ce80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ce90: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
cea0: 62 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, v);.      }. 
ceb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
cec0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
ced0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
cee0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
cef0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
cf00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cf10: 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
cf20: 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
cf30: 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
cf40: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
cf50: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
cf60: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
cf70: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
cf80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cf90: 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
cfa0: 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
cfb0: 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
cfc0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
cfd0: 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
cfe0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
cff0: 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78   sqliteDropIndex
d000: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d010: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
d020: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
d030: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
d040: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
d050: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
d060: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d070: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d080: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
d090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e 61   ) return;.  zNa
d0a0: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
d0b0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
d0c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
d0d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
d0e0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
d0f0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
d100: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
d110: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ee(zName);.  if(
d120: 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
d130: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
d140: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
d150: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  Msg, "no such in
d160: 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  dex: ", 0, .    
d170: 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e      pName->z, pN
d180: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
d190: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
d1a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d1b0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
d1c0: 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
d1d0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
d1e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
d1f0: 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
d200: 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
d210: 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
d220: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
d230: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
d240: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ped", 0);.    pP
d250: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
d260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 69    return;.  }.#i
d270: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d280: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
d290: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
d2a0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
d2b0: 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
d2c0: 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
d2d0: 70 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  pTable;.    if( 
d2e0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
d2f0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
d300: 45 4c 45 54 45 2c 20 53 43 48 45 4d 41 5f 54 41  ELETE, SCHEMA_TA
d310: 42 4c 45 28 70 54 61 62 2d 3e 69 73 54 65 6d 70  BLE(pTab->isTemp
d320: 29 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  ), 0) ){.      r
d330: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
d340: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 65 6d   if( pTab->isTem
d350: 70 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  p ) code = SQLIT
d360: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
d370: 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
d380: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
d390: 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
d3a0: 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
d3b0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ame) ){.      re
d3c0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
d3d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
d3e0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
d3f0: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
d400: 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
d410: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
d420: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
d430: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d440: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
d450: 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b  dbeOp dropIndex[
d460: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
d470: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
d480: 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20  ADDR(9), 0}, .  
d490: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
d4a0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
d4b0: 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20   0}, /* 1 */.   
d4c0: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
d4d0: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
d4e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
d4f0: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
d500: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
d510: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
d520: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
d530: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
d540: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
d550: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c   0, ADDR(8), 0},
d560: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
d570: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
d580: 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  3), 0},.      { 
d590: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
d5a0: 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20  , ADDR(9), 0},. 
d5b0: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
d5c0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
d5d0: 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
d5e0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73    };.    int bas
d5f0: 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  e;.    Table *pT
d600: 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
d610: 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ble;..    sqlite
d620: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d630: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
d640: 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  Tab->isTemp);.  
d650: 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74    sqliteOpenMast
d660: 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2d  erTable(v, pTab-
d670: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 62 61  >isTemp);.    ba
d680: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
d690: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
d6a0: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
d6b0: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
d6c0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
d6d0: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
d6e0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
d6f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
d700: 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ->isTemp ){.    
d710: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
d720: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
d730: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
d740: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
d750: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  se, 0, 0);.    s
d760: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d770: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
d780: 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  ndex->tnum, pTab
d790: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  ->isTemp);.    s
d7a0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
d7b0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
d7c0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
d7d0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
d7e0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
d7f0: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  is index..  */. 
d800: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
d810: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  plain ){.    sql
d820: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
d830: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
d840: 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ex);.    db->fla
d850: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
d860: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
d870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
d880: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
d890: 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
d8a0: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
d8b0: 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
d8c0: 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
d8d0: 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
d8e0: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
d8f0: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
d900: 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
d910: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
d920: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
d930: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
d940: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
d950: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d960: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
d970: 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
d980: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
d990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d9a0: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20  if( (pList->nId 
d9b0: 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  & 7)==0 ){.    s
d9c0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
d9d0: 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71  m *a;.    a = sq
d9e0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
d9f0: 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49  t->a, (pList->nI
da00: 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  d+8)*sizeof(pLis
da10: 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
da20: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
da30: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
da40: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
da50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
da60: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
da70: 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  = a;.  }.  memse
da80: 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
da90: 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65  t->nId], 0, size
daa0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
dab0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
dac0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
dad0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
dae0: 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->nId].zName;. 
daf0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
db00: 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ing(pz, pToken->
db10: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
db20: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
db30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
db40: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
db50: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
db60: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
db70: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
db80: 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a  ote(*pz);.    }.
db90: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64    }.  pList->nId
dba0: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
dbb0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  st;.}../*.** App
dbc0: 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20  end a new table 
dbd0: 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65  name to the give
dbe0: 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61  n SrcList.  Crea
dbf0: 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  te a new SrcList
dc00: 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20   if.** need be. 
dc10: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
dc20: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53  created in the S
dc30: 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70  rcList even if p
dc40: 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  Token is NULL..*
dc50: 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69  *.** A new SrcLi
dc60: 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
dc70: 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
dc80: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 53 72  c() fails..*/.Sr
dc90: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53 72 63  cList *sqliteSrc
dca0: 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69  ListAppend(SrcLi
dcb0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
dcc0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
dcd0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
dce0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
dcf0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
dd00: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
dd10: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
dd20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
dd30: 28 70 4c 69 73 74 2d 3e 6e 53 72 63 20 26 20 37  (pList->nSrc & 7
dd40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
dd50: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
dd60: 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69  *a;.    a = sqli
dd70: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
dd80: 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63  >a, (pList->nSrc
dd90: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  +8)*sizeof(pList
dda0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
ddb0: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
ddc0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
ddd0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
dde0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ddf0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
de00: 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  = a;.  }.  memse
de10: 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
de20: 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a  t->nSrc], 0, siz
de30: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
de40: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
de50: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
de60: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
de70: 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b  st->nSrc].zName;
de80: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
de90: 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e  tring(pz, pToken
dea0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
deb0: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
dec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ded0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
dee0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
def0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
df00: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  e{.      sqliteD
df10: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
df20: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
df30: 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
df40: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
df50: 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
df60: 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
df70: 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
df80: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
df90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
dfa0: 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  eSrcListAddAlias
dfb0: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
dfc0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
dfd0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
dfe0: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  pList->nSrc>0 ){
dff0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  .    int i = pLi
e000: 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20  st->nSrc - 1;.  
e010: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
e020: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
e030: 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
e040: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
e050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
e060: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
e070: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
e080: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
e090: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
e0a0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
e0b0: 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
e0c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
e0d0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
e0e0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
e0f0: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
e100: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
e110: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
e120: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
e130: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
e140: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
e150: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
e160: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
e170: 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
e180: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
e190: 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
e1a0: 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
e1b0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
e1c0: 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  eIdListIndex(IdL
e1d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
e1e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
e1f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
e200: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
e210: 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
e220: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
e230: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
e240: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
e250: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
e260: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
e270: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
e280: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  -1;.}../*.** Del
e290: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
e2a0: 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
e2b0: 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
e2c0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
e2d0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
e2e0: 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
e2f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
e300: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
e310: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
e320: 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
e330: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
e340: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
e350: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
e360: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
e370: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  i].zAlias);.    
e380: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
e390: 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61  pTab && pList->a
e3a0: 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e  [i].pTab->isTran
e3b0: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
e3c0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
e3d0: 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
e3e0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
e3f0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
e400: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
e410: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
e420: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
e430: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  List->a[i].pOn);
e440: 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73  .    sqliteIdLis
e450: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
e460: 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  [i].pUsing);.  }
e470: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
e480: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
e490: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
e4a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20  ./*.** The COPY 
e4b0: 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63  command is for c
e4c0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
e4d0: 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64  h PostgreSQL and
e4e0: 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a   specificially.*
e4f0: 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74  * for the abilit
e500: 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  y to read the ou
e510: 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e  tput of pg_dump.
e520: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20    The format is 
e530: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  as.** follows:.*
e540: 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62  *.**    COPY tab
e550: 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53  le FROM file [US
e560: 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73  ING DELIMITERS s
e570: 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61  tring].**.** "ta
e580: 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74  ble" is an exist
e590: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ing table name. 
e5a0: 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69   We will read li
e5b0: 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d  nes of code from
e5c0: 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c  .** file to fill
e5d0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68   this table with
e5e0: 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67   data.  File mig
e5f0: 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20  ht be "stdin".  
e600: 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20  The optional.** 
e610: 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67  delimiter string
e620: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
e630: 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73  field separators
e640: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
e650: 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64  s a tab..*/.void
e660: 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50   sqliteCopy(.  P
e670: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e680: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
e690: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
e6a0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
e6b0: 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20  ,   /* The name 
e6c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
e6d0: 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  o which we will 
e6e0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65  insert */.  Toke
e6f0: 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20  n *pFilename,   
e700: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
e710: 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69  m which to obtai
e720: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  n information */
e730: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d  .  Token *pDelim
e740: 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20 74  iter,   /* Use t
e750: 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64  his as the field
e760: 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20 20   delimiter */.  
e770: 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20 20  int onError     
e780: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
e790: 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61 69  do if a constrai
e7a0: 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20  nt fails */.){. 
e7b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
e7c0: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e  char *zTab;.  in
e7d0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  t i;.  Vdbe *v;.
e7e0: 20 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b    int addr, end;
e7f0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
e800: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20    char *zFile = 
e810: 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  0;.  sqlite *db 
e820: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 0a  = pParse->db;...
e830: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 54    zTab = sqliteT
e840: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
e850: 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  n(pTableName);. 
e860: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
e870: 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61  oc_failed || zTa
e880: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79  b==0 ) goto copy
e890: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62  _cleanup;.  pTab
e8a0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
e8b0: 6d 65 54 6f 54 61 62 6c 65 28 70 50 61 72 73 65  meToTable(pParse
e8c0: 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , zTab);.  sqlit
e8d0: 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69  eFree(zTab);.  i
e8e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
e8f0: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
e900: 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
e910: 53 74 72 4e 44 75 70 28 70 46 69 6c 65 6e 61 6d  StrNDup(pFilenam
e920: 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  e->z, pFilename-
e930: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71  >n);.  sqliteDeq
e940: 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20 20 69  uote(zFile);.  i
e950: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
e960: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
e970: 45 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 2d 3e  E_INSERT, pTab->
e980: 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 0a 20 20  zName, zFile).  
e990: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 41 75 74      || sqliteAut
e9a0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
e9b0: 51 4c 49 54 45 5f 43 4f 50 59 2c 20 70 54 61 62  QLITE_COPY, pTab
e9c0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 20  ->zName, zFile) 
e9d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79  ){.    goto copy
e9e0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
e9f0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
ea00: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ea10: 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70   v ){.    int op
ea20: 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  enOp;.    sqlite
ea30: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
ea40: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 70  ion(pParse, 1, p
ea50: 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  Tab->isTemp);.  
ea60: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
ea70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
ea80: 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a  ileOpen, 0, 0);.
ea90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
eaa0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
eab0: 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46  pFilename->z, pF
eac0: 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  ilename->n);.   
ead0: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
eae0: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
eaf0: 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62     openOp = pTab
eb00: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
eb10: 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65  enWrAux : OP_Ope
eb20: 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69  nWrite;.    sqli
eb30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
eb40: 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e  penOp, 0, pTab->
eb50: 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
eb60: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
eb70: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
eb80: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
eb90: 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d    for(i=1, pIdx=
eba0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ebb0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ebc0: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
ebd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ebe0: 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20  p(v, openOp, i, 
ebf0: 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pIdx->tnum);.   
ec00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
ec10: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
ec20: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
ec30: 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
ec40: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
ec50: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
ec60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ec70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ec80: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20  Integer, 0, 0); 
ec90: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
eca0: 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a  he row count */.
ecb0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20      }.    end = 
ecc0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
ecd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72  bel(v);.    addr
ece0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
ecf0: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61  Op(v, OP_FileRea
ed00: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65  d, pTab->nCol, e
ed10: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65  nd);.    if( pDe
ed20: 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20  limiter ){.     
ed30: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
ed40: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65  eP3(v, addr, pDe
ed50: 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c  limiter->z, pDel
ed60: 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20  imiter->n);.    
ed70: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
ed80: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
ed90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eda0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
edb0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74  eP3(v, addr, "\t
edc0: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 1);.    }.   
edd0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
ede0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=0 ){.      sql
edf0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ee00: 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70  OP_FileColumn, p
ee10: 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a  Tab->iPKey, 0);.
ee20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ee30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
ee40: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
ee50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
ee60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ee70: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
ee80: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
ee90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
eea0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
eeb0: 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e     if( i==pTab->
eec0: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
eed0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
eee0: 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  primary key colu
eef0: 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  mn is filled wit
ef00: 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74 73  h NULL since its
ef10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
ef20: 65 20 69 73 20 61 6c 77 61 79 73 20 70 75 6c 6c  e is always pull
ef30: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  ed from the reco
ef40: 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  rd number */.   
ef50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ef60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ef70: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
ef80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ef90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
efa0: 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c  , OP_FileColumn,
efb0: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   i, 0);.      }.
efc0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
efd0: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
efe0: 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c  ntChecks(pParse,
eff0: 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20   pTab, 0, 0, 0, 
f000: 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72  0, onError, addr
f010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d  );.    sqliteCom
f020: 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70  pleteInsertion(p
f030: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
f040: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
f050: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
f060: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29  QLITE_CountRows)
f070: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
f080: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f090: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
f0a0: 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  ;  /* Increment 
f0b0: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
f0c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
f0d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
f0e0: 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20  o, 0, addr);.   
f0f0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
f100: 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b  veLabel(v, end);
f110: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f120: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
f130: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
f140: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
f150: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
f160: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
f170: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
f180: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
f190: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f1a0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20  _ColumnName, 0, 
f1b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f1c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
f1d0: 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74  -1, "rows insert
f1e0: 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ed", P3_STATIC);
f1f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f200: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
f210: 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20  lback, 1, 0);.  
f220: 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f    }.  }.  .copy_
f230: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
f240: 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eFree(zFile);.  
f250: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
f260: 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   The non-standar
f270: 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  d VACUUM command
f280: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61   is used to clea
f290: 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73  n up the databas
f2a0: 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66  e,.** collapse f
f2b0: 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20  ree space, etc. 
f2c0: 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20   It is modelled 
f2d0: 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d  after the VACUUM
f2e0: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50   command.** in P
f2f0: 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a  ostgreSQL..**.**
f300: 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e   In version 1.0.
f310: 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65  x of SQLite, the
f320: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
f330: 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64  would call.** gd
f340: 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20  bm_reorganize() 
f350: 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62  on all the datab
f360: 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74  ase tables.  But
f370: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
f380: 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65  th 2.0.0, SQLite
f390: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
f3a0: 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d  GDBM so this com
f3b0: 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f  mand has.** beco
f3c0: 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76  me a no-op..*/.v
f3d0: 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d  oid sqliteVacuum
f3e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f3f0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
f400: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  e){.  /* Do noth
f410: 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
f420: 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
f430: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
f440: 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  teBeginTransacti
f450: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
f460: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
f470: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
f480: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
f490: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
f4a0: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
f4b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
f4c0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
f4d0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
f4e0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
f4f0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  ;.  if( sqliteAu
f500: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
f510: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
f520: 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 29 20  ON, "BEGIN", 0) 
f530: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f540: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f550: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
f560: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
f570: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
f580: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
f590: 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20  ErrMsg, "cannot 
f5a0: 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
f5b0: 69 6f 6e 20 22 0a 20 20 20 20 20 20 20 22 77 69  ion ".       "wi
f5c0: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
f5d0: 6f 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  on", 0);.    ret
f5e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
f5f0: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
f600: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
f610: 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  0);.  db->flags 
f620: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  |= SQLITE_InTran
f630: 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  s;.  db->onError
f640: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
f650: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
f660: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
f670: 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72  d sqliteCommitTr
f680: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
f690: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
f6a0: 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70  te *db;..  if( p
f6b0: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
f6c0: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
f6d0: 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72  | db->pBe==0 ) r
f6e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
f6f0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
f700: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
f710: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
f720: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
f730: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
f740: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
f750: 4f 4d 4d 49 54 22 2c 20 30 29 20 29 20 72 65 74  OMMIT", 0) ) ret
f760: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
f770: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
f780: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
f790: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
f7a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
f7b0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
f7c0: 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20  ErrMsg, .       
f7d0: 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d  "cannot commit -
f7e0: 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
f7f0: 69 73 20 61 63 74 69 76 65 22 2c 20 30 29 3b 0a  is active", 0);.
f800: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
f810: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
f820: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
f830: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
f840: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
f850: 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  );.  db->onError
f860: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d   = OE_Default;.}
f870: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
f880: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
f890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c  /.void sqliteRol
f8a0: 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
f8b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
f8c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
f8d0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
f8e0: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
f8f0: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
f900: 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29   || db->pBe==0 )
f910: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f920: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
f930: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
f940: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f950: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
f960: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f970: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
f980: 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 29 20 29  "ROLLBACK", 0) )
f990: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
f9a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f9b0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
f9c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  {.    pParse->nE
f9d0: 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  rr++;.    sqlite
f9e0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
f9f0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20  e->zErrMsg,.    
fa00: 20 20 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62     "cannot rollb
fa10: 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
fa20: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 2c  tion is active",
fa30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
fa40: 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69   .  }.  v = sqli
fa50: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
fa60: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
fa70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fa80: 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b  p(v, OP_Rollback
fa90: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  , 0, 0);.  }.  d
faa0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
fab0: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64  ITE_InTrans;.  d
fac0: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
fad0: 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
fae0: 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
faf0: 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
fb00: 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
fb10: 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
fb20: 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
fb30: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
fb40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fb50: 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
fb60: 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
fb70: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
fb80: 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
fb90: 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
fba0: 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
fbb0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
fbc0: 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
fbd0: 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
fbe0: 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  the setCheckpoin
fbf0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
fc00: 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
fc10: 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
fc20: 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
fc30: 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
fc40: 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
fc50: 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
fc60: 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
fc70: 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
fc80: 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
fc90: 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
fca0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
fcb0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
fcc0: 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
fcd0: 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
fce0: 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
fcf0: 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
fd00: 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
fd10: 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
fd20: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
fd30: 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
fd40: 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
fd50: 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
fd60: 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
fd70: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
fd80: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  set..**.** The t
fd90: 65 6d 70 4f 6e 6c 79 20 66 6c 61 67 20 69 6e 64  empOnly flag ind
fda0: 69 63 61 74 65 73 20 74 68 61 74 20 6f 6e 6c 79  icates that only
fdb0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fdc0: 73 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  s will be change
fdd0: 64 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 69 73  d.** during this
fde0: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
fdf0: 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79 20 64  .  The primary d
fe00: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
fe10: 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f   not.** write-lo
fe20: 63 6b 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 20  cked.  Only the 
fe30: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
fe40: 73 65 20 66 69 6c 65 20 67 65 74 73 20 61 20 77  se file gets a w
fe50: 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74  rite lock..** Ot
fe60: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
fe70: 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  n continue to re
fe80: 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
fe90: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
fea0: 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
feb0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
fec0: 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
fed0: 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43  pParse, int setC
fee0: 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 74  heckpoint, int t
fef0: 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56 64 62 65  empOnly){.  Vdbe
ff00: 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
ff10: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
ff20: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
ff30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
ff40: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
ff50: 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74   return; /* if t
ff60: 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67  his is in a trig
ff70: 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ger */.  if( (pP
ff80: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
ff90: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ffa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
ffb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ffc0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  P_Transaction, t
ffd0: 65 6d 70 4f 6e 6c 79 2c 20 30 29 3b 0a 20 20 20  empOnly, 0);.   
ffe0: 20 69 66 28 20 21 74 65 6d 70 4f 6e 6c 79 20 29   if( !tempOnly )
fff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
10000 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
10010 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72  rifyCookie, pPar
10020 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63  se->db->schema_c
10030 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
10040 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
10050 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 20  erified = 1;.   
10060 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73   }.  }else if( s
10070 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a  etCheckpoint ){.
10080 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10090 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  dOp(v, OP_Checkp
100a0 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  oint, 0, 0);.  }
100b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
100c0 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
100d0 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
100e0 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
100f0 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
10100 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
10110 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20   is a companion 
10120 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69  function to Begi
10130 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10140 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  )..** If a trans
10150 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
10160 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ed, then commit 
10170 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70  it.  If a checkp
10180 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72  oint was.** star
10190 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ted then commit 
101a0 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  that..*/.void sq
101b0 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
101c0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
101d0 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
101e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74  .  if( pParse->t
101f0 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72  rigStack ) retur
10200 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73  n; /* if this is
10210 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f   in a trigger */
10220 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
10230 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10240 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
10250 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
10260 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10270 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
10280 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67     /* Do Nothing
10290 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
102a0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
102b0 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
102c0 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , 0);.  }.}.../*
102d0 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
102e0 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
102f0 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
10300 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10310 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72   getBoolean(char
10320 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *z){.  static c
10330 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20  har *azTrue[] = 
10340 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22  { "yes", "on", "
10350 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69  true" };.  int i
10360 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20  ;.  if( z[0]==0 
10370 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10380 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20  ( isdigit(z[0]) 
10390 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  || (z[0]=='-' &&
103a0 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20   isdigit(z[1])) 
103b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74  ){.    return at
103c0 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  oi(z);.  }.  for
103d0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
103e0 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a  zTrue)/sizeof(az
103f0 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  True[0]); i++){.
10400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
10410 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69  rICmp(z,azTrue[i
10420 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
10430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
10450 73 73 20 61 20 70 72 61 67 6d 61 20 73 74 61 74  ss a pragma stat
10460 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50  ement.  .**.** P
10470 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68  ragmas are of th
10480 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  is form:.**.**  
10490 20 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d 20      PRAGMA id = 
104a0 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  value.**.** The 
104b0 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74  identifier might
104c0 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e   also be a strin
104d0 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  g.  The value is
104e0 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a   a string, and.*
104f0 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72  * identifier, or
10500 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d   a number.  If m
10510 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65  inusFlag is true
10520 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
10530 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20   is.** a number 
10540 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65  that was precede
10550 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
10560 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
10570 65 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70  ePragma(Parse *p
10580 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c  Parse, Token *pL
10590 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
105a0 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61  ht, int minusFla
105b0 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66  g){.  char *zLef
105c0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
105d0 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Right = 0;.  sql
105e0 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
105f0 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d  ->db;..  zLeft =
10600 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
10610 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e  Left->z, pLeft->
10620 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
10630 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66  ote(zLeft);.  if
10640 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
10650 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20     zRight = 0;. 
10660 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
10670 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22  ing(&zRight, "-"
10680 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20  , 1, pRight->z, 
10690 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20  pRight->n, 0);. 
106a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67   }else{.    zRig
106b0 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ht = sqliteStrND
106c0 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52  up(pRight->z, pR
106d0 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  ight->n);.    sq
106e0 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67  liteDequote(zRig
106f0 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ht);.  }.  if( s
10700 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
10710 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
10720 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
10730 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
10740 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20  teFree(zLeft);. 
10750 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52     sqliteFree(zR
10760 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
10770 6e 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20  n;.  }. .  /*.  
10780 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
10790 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  lt_cache_size.  
107a0 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
107b0 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a  lt_cache_size=N.
107c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
107d0 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
107e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 65 72   the current per
107f0 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20  sistent setting 
10800 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
10810 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54  e cache size.  T
10820 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
10830 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  d is the maximum
10840 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
10850 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
10860 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65  e cache.  The se
10870 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62  cond form sets b
10880 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a  oth the current.
10890 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
108a0 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74  size value and t
108b0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 70 61  he persistent pa
108c0 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
108d0 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  lue.  ** stored 
108e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
108f0 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file..  **.  ** 
10900 54 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68  The default cach
10910 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64  e size is stored
10920 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32   in meta-value 2
10930 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20 74 68   of page 1 of th
10940 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
10950 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65  file.  The cache
10960 20 73 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c   size is actuall
10970 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  y the absolute v
10980 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69  alue of.  ** thi
10990 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
109a0 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20  n.  The sign of 
109b0 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74  meta-value 2 det
109c0 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a  ermines the.  **
109d0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
109e0 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76  ting.  A negativ
109f0 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79  e value means sy
10a00 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10a10 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69  .  ** and a posi
10a20 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73  tive value means
10a30 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10a40 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  on..  */.  if( s
10a50 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
10a60 66 74 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68  ft,"default_cach
10a70 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  e_size")==0 ){. 
10a80 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
10a90 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20   getCacheSize[] 
10aa0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
10ab0 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32  eadCookie,  0, 2
10ac0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
10ad0 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65     { OP_AbsValue
10ae0 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
10af0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
10b00 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c  _Dup,         0,
10b10 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
10b20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
10b30 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
10b40 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
10b50 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20  OP_Ne,          
10b60 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 6,        0},
10b70 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
10b80 67 65 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47  ger,     MAX_PAG
10b90 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  ES,0, 0},.      
10ba0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10bb0 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
10bc0 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20  cache_size"},.  
10bd0 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
10be0 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
10bf0 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
10c00 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
10c10 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10c20 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
10c30 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
10c40 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65  ( pRight->z==pLe
10c50 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73  ft->z ){.      s
10c60 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
10c70 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
10c80 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
10c90 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20 20  etCacheSize);.  
10ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10cb0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69  nt addr;.      i
10cc0 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a  nt size = atoi(z
10cd0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
10ce0 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  ( size<0 ) size 
10cf0 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73  = -size;.      s
10d00 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
10d10 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
10d20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
10d30 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10d40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a   OP_Integer, siz
10d50 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
10d60 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10d70 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30  OP_ReadCookie, 0
10d80 2c 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 2);.      addr
10d90 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
10da0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10db0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
10dc0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10dd0 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72  , OP_Ge, 0, addr
10de0 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
10df0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10e00 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29  _Negative, 0, 0)
10e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
10e20 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
10e30 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  tCookie, 0, 2);.
10e40 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57        sqliteEndW
10e50 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10e60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d  arse);.      db-
10e70 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62  >cache_size = db
10e80 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f  ->cache_size<0 ?
10e90 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20   -size : size;. 
10ea0 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
10eb0 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d  SetCacheSize(db-
10ec0 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f  >pBe, db->cache_
10ed0 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  size);.    }.  }
10ee0 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
10ef0 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
10f00 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
10f10 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  cache_size=N.  *
10f20 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
10f30 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
10f40 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
10f50 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
10f60 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
10f70 73 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c  size.  The local
10f80 20 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65 20   setting can be 
10f90 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20  different from. 
10fa0 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
10fb0 6e 74 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  nt cache size va
10fc0 6c 75 65 20 74 68 61 74 20 69 73 20 73 74 6f 72  lue that is stor
10fd0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
10fe0 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 73  se.  ** file its
10ff0 65 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65 20  elf.  The value 
11000 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
11010 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
11020 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20  f.  ** pages in 
11030 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
11040 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
11050 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
11060 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
11070 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74 20  size value.  It 
11080 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
11090 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 20  the persistent. 
110a0 20 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20 73   ** cache size s
110b0 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69 73  tored on the dis
110c0 6b 20 73 6f 20 74 68 65 20 63 61 63 68 65 20 73  k so the cache s
110d0 69 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74 0a  ize will revert.
110e0 20 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66 61    ** to its defa
110f0 75 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ult value when t
11100 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
11110 6c 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65 6e  losed and reopen
11120 65 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c  ed..  ** N shoul
11130 64 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20  d be a positive 
11140 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  integer..  */.  
11150 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
11160 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73  p(zLeft,"cache_s
11170 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
11180 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65  static VdbeOp ge
11190 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b  tCacheSize[] = {
111a0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
111b0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
111c0 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a        "cache_siz
111d0 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e"},.      { OP_
111e0 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
111f0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11200 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
11210 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
11220 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
11230 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
11240 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
11250 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
11260 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
11270 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b   db->cache_size;
11280 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
11290 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
112a0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
112b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
112c0 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29  nteger, size, 0)
112d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
112e0 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
112f0 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68  rraySize(getCach
11300 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65  eSize), getCache
11310 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
11320 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
11330 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b   = atoi(zRight);
11340 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c  .      if( size<
11350 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65  0 ) size = -size
11360 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
11370 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 29 20 73  cache_size<0 ) s
11380 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
11390 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a     db->cache_siz
113a0 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
113b0 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61  sqliteBtreeSetCa
113c0 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c  cheSize(db->pBe,
113d0 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
113e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
113f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
11400 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  MA default_synch
11410 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41  ronous.  **  PRA
11420 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63  GMA default_sync
11430 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a  hronous=BOOLEAN.
11440 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
11450 72 73 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73  rst form returns
11460 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
11470 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79  value of the "sy
11480 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69  nchronous" setti
11490 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  ng.  ** that is 
114a0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
114b0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
114c0 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73   the synchronous
114d0 20 73 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20   setting that.  
114e0 2a 2a 20 69 73 20 75 73 65 64 20 77 68 65 6e 65  ** is used whene
114f0 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
11500 20 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73   is opened unles
11510 73 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  s overridden by 
11520 61 20 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20  a separate.  ** 
11530 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72  "synchronous" pr
11540 61 67 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e  agma.  The secon
11550 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74  d form changes t
11560 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e  he persistent an
11570 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c  d the.  ** local
11580 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
11590 74 69 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75  ting to the valu
115a0 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20  e given..  **.  
115b0 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75  ** If synchronou
115c0 73 20 69 73 20 6f 6e 2c 20 53 51 4c 69 74 65 20  s is on, SQLite 
115d0 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63  will do an fsync
115e0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  () system call a
115f0 74 20 73 74 72 61 74 65 67 69 63 0a 20 20 2a 2a  t strategic.  **
11600 20 70 6f 69 6e 74 73 20 74 6f 20 69 6e 73 75 72   points to insur
11610 65 20 74 68 61 74 20 61 6c 6c 20 70 72 65 76 69  e that all previ
11620 6f 75 73 6c 79 20 77 72 69 74 74 65 6e 20 64 61  ously written da
11630 74 61 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  ta has actually 
11640 62 65 65 6e 0a 20 20 2a 2a 20 77 72 69 74 74 65  been.  ** writte
11650 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
11660 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 20 63  surface before c
11670 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 68 69 73  ontinuing.  This
11680 20 6d 6f 64 65 20 69 6e 73 75 72 65 73 20 74 68   mode insures th
11690 61 74 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  at.  ** the data
116a0 62 61 73 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  base will always
116b0 20 62 65 20 69 6e 20 61 20 63 6f 6e 73 69 73 74   be in a consist
116c0 65 6e 74 20 73 74 61 74 65 20 65 76 65 6e 74 20  ent state event 
116d0 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
116e0 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61  .  ** system cra
116f0 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 74 6f  shes or power to
11700 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 69 73   the computer is
11710 20 69 6e 74 65 72 72 75 70 74 65 64 20 75 6e 65   interrupted une
11720 78 70 65 63 74 65 64 6c 79 2e 0a 20 20 2a 2a 20  xpectedly..  ** 
11730 57 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  When synchronous
11740 20 69 73 20 6f 66 66 2c 20 53 51 4c 69 74 65 20   is off, SQLite 
11750 77 69 6c 6c 20 6e 6f 74 20 77 61 69 74 20 66 6f  will not wait fo
11760 72 20 63 68 61 6e 67 65 73 20 74 6f 20 61 63 74  r changes to act
11770 75 61 6c 6c 79 0a 20 20 2a 2a 20 62 65 20 77 72  ually.  ** be wr
11780 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
11790 6b 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  k before continu
117a0 69 6e 67 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73  ing.  As soon as
117b0 20 69 74 20 68 61 6e 64 73 20 63 68 61 6e 67 65   it hands change
117c0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70  s.  ** to the op
117d0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
117e0 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
117f0 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  the changes are 
11800 70 65 72 6d 61 6e 65 6e 74 20 61 6e 64 0a 20 20  permanent and.  
11810 2a 2a 20 69 74 20 63 6f 6e 74 69 6e 75 65 73 20  ** it continues 
11820 67 6f 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  going.  The data
11830 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
11840 6f 72 72 75 70 74 65 64 20 62 79 20 61 20 70 72  orrupted by a pr
11850 6f 67 72 61 6d 20 63 72 61 73 68 0a 20 20 2a 2a  ogram crash.  **
11860 20 65 76 65 6e 20 77 69 74 68 20 73 79 6e 63 68   even with synch
11870 72 6f 6e 6f 75 73 20 6f 66 66 2c 20 62 75 74 20  ronous off, but 
11880 61 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  an operating sys
11890 74 65 6d 20 63 72 61 73 68 20 6f 72 20 70 6f 77  tem crash or pow
118a0 65 72 20 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f 75  er loss.  ** cou
118b0 6c 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63  ld potentially c
118c0 6f 72 72 75 70 74 20 64 61 74 61 2e 20 20 4f 6e  orrupt data.  On
118d0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
118e0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66   synchronous off
118f0 20 69 73 0a 20 20 2a 2a 20 66 61 73 74 65 72 20   is.  ** faster 
11900 74 68 61 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  than synchronous
11910 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
11920 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
11930 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e  eft,"default_syn
11940 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b  chronous")==0 ){
11950 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
11960 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b  Op getSync[] = {
11970 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
11980 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
11990 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
119a0 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
119b0 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
119c0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
119d0 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c  teger,     0, 0,
119e0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
119f0 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20    { OP_Lt,      
11a00 20 20 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20      0, 5,       
11a10 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11a20 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20  AddImm,      1, 
11a30 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11a40 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11a50 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
11a60 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22     "synchronous"
11a70 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
11a80 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
11a90 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
11aa0 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
11ab0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
11ac0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
11ad0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
11ae0 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
11af0 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
11b00 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11b10 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
11b20 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67  Size(getSync), g
11b30 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c  etSync);.    }el
11b40 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  se{.      int ad
11b50 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  dr;.      int si
11b60 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73  ze = db->cache_s
11b70 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ize;.      if( s
11b80 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
11b90 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
11ba0 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
11bb0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
11bc0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11bd0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11be0 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20  _ReadCookie, 0, 
11bf0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
11c00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11c10 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
11c20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
11c30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11c40 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
11c50 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11c60 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30  ddOp(v, OP_Ne, 0
11c70 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
11c80 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11c90 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d  (v, OP_AddImm, M
11ca0 41 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20 20  AX_PAGES, 0);.  
11cb0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11cc0 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c  dOp(v, OP_AbsVal
11cd0 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ue, 0, 0);.     
11ce0 20 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e   if( !getBoolean
11cf0 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
11d00 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11d10 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69  dOp(v, OP_Negati
11d20 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ve, 0, 0);.     
11d30 20 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b     size = -size;
11d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11d50 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11d60 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
11d70 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 2);.      sql
11d80 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
11d90 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
11da0 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69      db->cache_si
11db0 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  ze = size;.     
11dc0 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43   sqliteBtreeSetC
11dd0 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65  acheSize(db->pBe
11de0 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
11df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
11e00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
11e10 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
11e20 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
11e30 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45  ynchronous=BOOLE
11e40 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  AN.  **.  ** Ret
11e50 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c  urn or set the l
11e60 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  ocal value of th
11e70 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c  e synchronous fl
11e80 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
11e90 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ** the local val
11ea0 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ue does not make
11eb0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
11ec0 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68  disk file and th
11ed0 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76  e.  ** default v
11ee0 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73  alue will be res
11ef0 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74  tored the next t
11f00 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
11f10 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e   is.  ** opened.
11f20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
11f30 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
11f40 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d  "synchronous")==
11f50 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
11f60 56 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d  VdbeOp getSync[]
11f70 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
11f80 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
11f90 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68  0,        "synch
11fa0 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20  ronous"},.      
11fb0 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
11fc0 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
11fd0 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
11fe0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
11ff0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12000 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
12010 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52  turn;.    if( pR
12020 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e  ight->z==pLeft->
12030 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
12040 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12050 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 63 61  _Integer, db->ca
12060 63 68 65 5f 73 69 7a 65 3e 3d 30 2c 20 30 29 3b  che_size>=0, 0);
12070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12080 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
12090 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29  raySize(getSync)
120a0 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20  , getSync);.    
120b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
120c0 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68   size = db->cach
120d0 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  e_size;.      if
120e0 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  ( size<0 ) size 
120f0 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  = -size;.      i
12100 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  f( !getBoolean(z
12110 52 69 67 68 74 29 20 29 20 73 69 7a 65 20 3d 20  Right) ) size = 
12120 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d  -size;.      db-
12130 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
12140 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
12150 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
12160 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63  e(db->pBe, db->c
12170 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
12180 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
12190 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
121a0 4c 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f 6f  Left, "trigger_o
121b0 76 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d 3d  verhead_test")==
121c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
121d0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
121e0 29 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f  ){.      always_
121f0 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74  code_trigger_set
12200 75 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  up = 1;.    }els
12210 65 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f  e{.      always_
12220 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74  code_trigger_set
12230 75 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  up = 0;.    }.  
12240 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
12250 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
12260 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d  , "vdbe_trace")=
12270 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
12280 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
12290 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
122a0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64  ags |= SQLITE_Vd
122b0 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c  beTrace;.    }el
122c0 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
122d0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56  ags &= ~SQLITE_V
122e0 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a  dbeTrace;.    }.
122f0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
12300 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
12310 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  ft, "full_column
12320 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20  _names")==0 ){. 
12330 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
12340 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
12350 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
12360 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
12370 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mes;.    }else{.
12380 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
12390 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
123a0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20  olNames;.    }. 
123b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
123c0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
123d0 74 2c 20 22 73 68 6f 77 5f 64 61 74 61 74 79 70  t, "show_datatyp
123e0 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  es")==0 ){.    i
123f0 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
12400 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
12410 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
12420 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a  TE_ReportTypes;.
12430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12440 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
12450 51 4c 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65  QLITE_ReportType
12460 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
12470 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
12480 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65  rICmp(zLeft, "re
12490 73 75 6c 74 5f 73 65 74 5f 64 65 74 61 69 6c 73  sult_set_details
124a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
124b0 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
124c0 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
124d0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
124e0 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a  _ResultDetails;.
124f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12500 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
12510 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61  QLITE_ResultDeta
12520 69 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ils;.    }.  }el
12530 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
12540 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
12550 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d  count_changes")=
12560 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
12570 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
12580 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
12590 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f  ags |= SQLITE_Co
125a0 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c  untRows;.    }el
125b0 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
125c0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43  ags &= ~SQLITE_C
125d0 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a  ountRows;.    }.
125e0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
125f0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
12600 66 74 2c 20 22 65 6d 70 74 79 5f 72 65 73 75 6c  ft, "empty_resul
12610 74 5f 63 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30  t_callbacks")==0
12620 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
12630 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
12640 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
12650 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c  s |= SQLITE_Null
12660 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65  Callback;.    }e
12670 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
12680 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
12690 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  NullCallback;.  
126a0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
126b0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
126c0 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65 5f 69  (zLeft, "table_i
126d0 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfo")==0 ){.    
126e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
126f0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54   Vdbe *v;.    pT
12700 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  ab = sqliteFindT
12710 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29  able(db, zRight)
12720 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
12730 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
12740 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
12750 69 66 28 20 70 54 61 62 20 26 26 20 76 20 29 7b  if( pTab && v ){
12760 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64  .      static Vd
12770 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72  beOp tableInfoPr
12780 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eface[] = {.    
12790 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
127a0 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
127b0 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20    "cid"},.      
127c0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
127d0 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
127e0 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20  "name"},.       
127f0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
12800 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  2, 0,       "
12810 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  type"},.        
12820 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
12830 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    3, 0,       "n
12840 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20  otnull"},.      
12850 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
12860 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20  e,  4, 0,       
12870 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20  "dflt_value"},. 
12880 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
12890 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
128a0 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
128b0 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
128c0 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
128d0 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
128e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69  ;.      sqliteVi
128f0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
12900 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
12910 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12920 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
12930 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12940 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12950 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
12960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12970 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
12980 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
12990 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
129a0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
129b0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
129c0 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
129d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
129e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
129f0 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
12a00 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12a10 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
12a20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
12a30 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
12a40 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  ? pTab->aCol[i].
12a50 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65 72 69 63  zType : "numeric
12a60 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
12a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
12a80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
12a90 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  eger, pTab->aCol
12aa0 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b  [i].notNull, 0);
12ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12ac0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
12ad0 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
12ae0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12af0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
12b00 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  pTab->aCol[i].zD
12b10 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  flt, P3_STATIC);
12b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12b30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
12b40 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a  allback, 5, 0);.
12b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12b60 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
12b70 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
12b80 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d  , "index_info")=
12b90 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
12ba0 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
12bb0 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65   *pTab;.    Vdbe
12bc0 20 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20   *v;.    pIdx = 
12bd0 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
12be0 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  db, zRight);.   
12bf0 20 69 66 28 20 70 49 64 78 20 29 20 76 20 3d 20   if( pIdx ) v = 
12c00 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
12c10 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  arse);.    if( p
12c20 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20  Idx && v ){.    
12c30 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
12c40 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
12c50 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
12c60 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
12c70 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65   0, 0,       "se
12c80 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  qno"},.        {
12c90 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
12ca0 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69   1, 0,       "ci
12cb0 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  d"},.        { O
12cc0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32  P_ColumnName,  2
12cd0 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65  , 0,       "name
12ce0 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  "},.      };.   
12cf0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
12d00 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
12d10 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
12d20 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
12d30 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
12d40 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
12d50 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
12d60 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12d70 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
12d80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12d90 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d  int cnum = pIdx-
12da0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
12db0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12dc0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
12dd0 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
12de0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12df0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
12e00 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20  r, cnum, 0);.   
12e10 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12e20 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
12e30 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
12e40 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
12e50 6e 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20 20  nCol>cnum );.   
12e60 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
12e70 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
12e80 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e  Tab->aCol[cnum].
12e90 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
12ea0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12eb0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12ec0 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29  _Callback, 3, 0)
12ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12ee0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
12ef0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
12f00 66 74 2c 20 22 69 6e 64 65 78 5f 6c 69 73 74 22  ft, "index_list"
12f10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
12f20 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62  x *pIdx;.    Tab
12f30 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64  le *pTab;.    Vd
12f40 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20  be *v;.    pTab 
12f50 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
12f60 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20  e(db, zRight);. 
12f70 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
12f80 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47       v = sqliteG
12f90 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12fa0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 54 61        pIdx = pTa
12fb0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  b->pIndex;.    }
12fc0 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26  .    if( pTab &&
12fd0 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20   pIdx && v ){.  
12fe0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a      int i = 0; .
12ff0 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62        static Vdb
13000 65 4f 70 20 69 6e 64 65 78 4c 69 73 74 50 72 65  eOp indexListPre
13010 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  face[] = {.     
13020 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
13030 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
13040 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20 20   "seq"},.       
13050 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
13060 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  1, 0,       "
13070 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  name"},.        
13080 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
13090 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 75    2, 0,       "u
130a0 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d  nique"},.      }
130b0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ;..      sqliteV
130c0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
130d0 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78 4c  ArraySize(indexL
130e0 69 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e 64  istPreface), ind
130f0 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b 0a  exListPreface);.
13100 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64 78        while(pIdx
13110 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13120 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13130 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
13140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13150 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13160 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
13170 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
13180 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
13190 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
131a0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
131b0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
131c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
131d0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
131e0 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20  E_None, 0);.    
131f0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13200 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
13210 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20  ck, 3, 0);.     
13220 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20     ++i;.        
13230 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65  pIdx = pIdx->pNe
13240 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
13250 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
13260 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
13270 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
13280 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72 61  eft, "parser_tra
13290 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  ce")==0 ){.    e
132a0 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74  xtern void sqlit
132b0 65 50 61 72 73 65 72 54 72 61 63 65 28 46 49 4c  eParserTrace(FIL
132c0 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20 20  E*, char *);.   
132d0 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
132e0 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
132f0 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
13300 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73  ce(stdout, "pars
13310 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  er: ");.    }els
13320 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  e{.      sqliteP
13330 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29  arserTrace(0, 0)
13340 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
13350 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
13360 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
13370 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68  t, "integrity_ch
13380 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eck")==0 ){.    
13390 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 63 68  static VdbeOp ch
133a0 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20  eckDb[] = {.    
133b0 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74    { OP_SetInsert
133c0 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  ,   0, 0,       
133d0 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f   "2"},.      { O
133e0 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 30  P_Open,        0
133f0 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
13400 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e        { OP_Rewin
13410 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20 20 20  d,      0, 6,   
13420 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
13430 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
13440 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
13450 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
13460 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72     { OP_SetInser
13470 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  t,   0, 0,      
13480 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
13490 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20 30 2c  _Next,        0,
134a0 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   3,        0},. 
134b0 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 72       { OP_Integr
134c0 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20 20 20  ityCk, 0, 0,    
134d0 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 36 20      0},    /* 6 
134e0 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
134f0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
13500 20 20 20 20 20 20 20 20 22 69 6e 74 65 67 72 69          "integri
13510 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20  ty_check"},.    
13520 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
13530 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
13540 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
13550 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20  SetInsert,   1, 
13560 30 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a  0,        "2"},.
13570 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 41        { OP_OpenA
13580 75 78 2c 20 20 20 20 20 31 2c 20 32 2c 20 20 20  ux,     1, 2,   
13590 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
135a0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
135b0 20 31 2c 20 31 35 2c 20 20 20 20 20 20 20 30 7d   1, 15,       0}
135c0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
135d0 75 6d 6e 2c 20 20 20 20 20 20 31 2c 20 33 2c 20  umn,      1, 3, 
135e0 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
135f0 20 31 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f   12 */.      { O
13600 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31  P_SetInsert,   1
13610 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
13620 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
13630 20 20 20 20 20 20 20 20 31 2c 20 31 32 2c 20 20          1, 12,  
13640 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
13650 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c   OP_IntegrityCk,
13660 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
13670 2c 20 20 20 20 2f 2a 20 31 35 20 2a 2f 0a 20 20  ,    /* 15 */.  
13680 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
13690 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
136a0 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
136b0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
136c0 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
136d0 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
136e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
136f0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
13700 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63  t(v, ArraySize(c
13710 68 65 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62  heckDb), checkDb
13720 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d  );.  }else..  {}
13730 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c  .  sqliteFree(zL
13740 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  eft);.  sqliteFr
13750 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a        ee(zRight);.}.