/ Hex Artifact Content
Login

Artifact abd5da38923bba6c5dc14d0e24b8e05f68ff459b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 31 33 34 20 32 30  ild.c,v 1.134 20
0310: 30 33 2f 30 33 2f 32 37 20 31 32 3a 35 31 3a 32  03/03/27 12:51:2
0320: 34 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  4 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 66 61 6b  ** This is a fak
0590: 65 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e callback proce
05a0: 64 75 72 65 20 75 73 65 64 20 77 68 65 6e 20 73  dure used when s
05b0: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 69 73 0a  qlite_exec() is.
05c0: 2a 2a 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  ** invoked with 
05d0: 61 20 4e 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 20  a NULL callback 
05e0: 70 6f 69 6e 74 65 72 2e 20 20 49 66 20 77 65 20  pointer.  If we 
05f0: 70 61 73 73 20 61 20 4e 55 4c 4c 20 63 61 6c 6c  pass a NULL call
0600: 62 61 63 6b 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  back.** pointer 
0610: 69 6e 74 6f 20 73 71 6c 69 74 65 56 64 62 65 45  into sqliteVdbeE
0620: 78 65 63 28 29 20 69 74 20 77 69 6c 6c 20 72 65  xec() it will re
0630: 74 75 72 6e 20 61 74 20 65 76 65 72 79 20 4f 50  turn at every OP
0640: 5f 43 61 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 77 68  _Callback,.** wh
0650: 69 63 68 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  ich we do not wa
0660: 6e 74 20 69 74 20 74 6f 20 64 6f 2e 20 20 53 6f  nt it to do.  So
0670: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61   we substitute a
0680: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
0690: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 69 6e  .** procedure in
06a0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 4e 55   place of the NU
06b0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
06c0: 74 20 66 61 6b 65 43 61 6c 6c 62 61 63 6b 28 76  t fakeCallback(v
06d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  oid *NotUsed, in
06e0: 74 20 6e 2c 20 63 68 61 72 20 2a 2a 61 7a 31 2c  t n, char **az1,
06f0: 20 63 68 61 72 20 2a 2a 61 7a 32 29 7b 0a 20 20   char **az2){.  
0700: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0720: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0730: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0740: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0750: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
0760: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
0770: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
0780: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0790: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
07a0: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
07b0: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
07c0: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
07d0: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
07e0: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
07f0: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0800: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0810: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0820: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
0830: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
0840: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0860: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0870: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0880: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0890: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
08a0: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
08b0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
08c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
08d0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
08e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
08f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
0900: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
0910: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
0920: 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68  d*,int,char**,ch
0930: 61 72 2a 2a 29 3b 0a 0a 20 20 69 66 28 20 73 71  ar**);..  if( sq
0940: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
0950: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  ed ) return;.  x
0960: 43 61 6c 6c 62 61 63 6b 20 3d 20 70 50 61 72 73  Callback = pPars
0970: 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  e->xCallback;.  
0980: 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 3d 3d 30  if( xCallback==0
0990: 20 26 26 20 70 50 61 72 73 65 2d 3e 75 73 65 43   && pParse->useC
09a0: 61 6c 6c 62 61 63 6b 20 29 20 78 43 61 6c 6c 62  allback ) xCallb
09b0: 61 63 6b 20 3d 20 66 61 6b 65 43 61 6c 6c 62 61  ack = fakeCallba
09c0: 63 6b 3b 0a 20 20 69 66 28 20 76 20 26 26 20 70  ck;.  if( v && p
09d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
09e0: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
09f0: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0a00: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0a10: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0a20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   0;.    sqliteVd
0a30: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
0a40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0a50: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 78 43  eMakeReady(v, xC
0a60: 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73 65 2d  allback, pParse-
0a70: 3e 70 41 72 67 2c 20 70 50 61 72 73 65 2d 3e 65  >pArg, pParse->e
0a80: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28  xplain);.    if(
0a90: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0aa0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66  back ){.      if
0ab0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
0ac0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
0ad0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74  = sqliteVdbeList
0ae0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  (v);.        db-
0af0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
0b00: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
0b10: 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 7d  _cookie;.      }
0b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
0b30: 6c 69 74 65 56 64 62 65 45 78 65 63 28 76 29 3b  liteVdbeExec(v);
0b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
0b50: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69  c = sqliteVdbeFi
0b60: 6e 61 6c 69 7a 65 28 76 2c 20 26 70 50 61 72 73  nalize(v, &pPars
0b70: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0b80: 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72     if( rc ) pPar
0b90: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0ba0: 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20    pParse->pVdbe 
0bb0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 72 73  = 0;.      pPars
0bc0: 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
0bd0: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0be0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0bf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
0c00: 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d  se->rc = pParse-
0c10: 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45  >nErr ? SQLITE_E
0c20: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
0c30: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  NE;.    }.    pP
0c40: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
0c50: 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  t = 0;.    pPars
0c60: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
0c70: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 0;.  }else i
0c80: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61  f( pParse->useCa
0c90: 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
0ca0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
0cb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
0cc0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
0cd0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
0ce0: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
0cf0: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
0d00: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
0d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
0d20: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
0d30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
0d40: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
0d50: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
0d60: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
0d70: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74   name.** of that
0d80: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
0d90: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
0da0: 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  d..*/.Table *sql
0db0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  iteFindTable(sql
0dc0: 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  ite *db, const c
0dd0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
0de0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
0df0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
0e00: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
0e10: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0e20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
0e30: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0e40: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
0e50: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
0e60: 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[i].zName) ) co
0e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
0e80: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
0e90: 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48 61  db->aDb[i].tblHa
0ea0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
0eb0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
0ec0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
0ed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
0ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
0ef0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
0f00: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
0f10: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
0f20: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
0f30: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
0f40: 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52  that index..** R
0f50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
0f60: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  t found..*/.Inde
0f70: 78 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64  x *sqliteFindInd
0f80: 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63  ex(sqlite *db, c
0f90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
0fb0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
0fc0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
0fd0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0fe0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
0ff0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 53 74   zDb && sqliteSt
1000: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1010: 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[i].zName) ) c
1020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1030: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
1040: 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 64 78 48  &db->aDb[i].idxH
1050: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
1060: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
1070: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
1080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
10a0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
10b0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
10c0: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
10d0: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
10e0: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
10f0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
1100: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1110: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
1120: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
1130: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
1140: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
1150: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
1160: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
1170: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
1180: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
1190: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
11a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
11b0: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
11c0: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
11d0: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
11e0: 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73  dex *pOld;..  as
11f0: 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70  sert( db!=0 && p
1200: 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ->zName!=0 );.  
1210: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
1220: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
1230: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
1240: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
1270: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
1280: 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70  if( pOld!=0 && p
1290: 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71  Old!=p ){.    sq
12a0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
12b0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
12c0: 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a  idxHash, pOld->z
12d0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
12e0: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
12f0: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
1300: 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 73  , pOld);.  }.  s
1310: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
1320: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
1330: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
1340: 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  om its table, th
1350: 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65  en remove.** the
1360: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
1370: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
1380: 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65   and free its me
1390: 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72  mory.** structur
13a0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
13b0: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
13c0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
13d0: 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  b, Index *pIndex
13e0: 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ){.  if( pIndex-
13f0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
1400: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  =pIndex ){.    p
1410: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
1420: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
1430: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
1440: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
1450: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
1460: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
1470: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
1480: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
1490: 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20 26  t){}.    if( p &
14a0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
14b0: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ex ){.      p->p
14c0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
14d0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
14e0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
14f0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
1510: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
1520: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1530: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1540: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61  ables of.** data
1550: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1560: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1570: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
1580: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
1590: 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  fore the connect
15a0: 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ion closes.  It 
15b0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
15c0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
15d0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
15e0: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
15f0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
1600: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  saction..*/.void
1610: 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65   sqliteResetInte
1620: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
1630: 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  e *db){.  HashEl
1640: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1650: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1660: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 3b 0a  temp2;.  int i;.
1670: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1680: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1690: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
16a0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70  aDb[i];.    temp
16b0: 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68  1 = pDb->tblHash
16c0: 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44  ;.    temp2 = pD
16d0: 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  b->trigHash;.   
16e0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28   sqliteHashInit(
16f0: 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20  &pDb->trigHash, 
1700: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
1710: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  NG, 0);.    sqli
1720: 74 65 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  teHashClear(&pDb
1730: 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71  ->aFKey);.    sq
1740: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
1750: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20  Db->idxHash);.  
1760: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
1770: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
1780: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
1790: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
17a0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
17b0: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
17c0: 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  r = sqliteHashDa
17d0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20  ta(pElem);.     
17e0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72 69   sqliteDeleteTri
17f0: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
1800: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1810: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32  HashClear(&temp2
1820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  );.    sqliteHas
1830: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
1840: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
1850: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
1860: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
1870: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
1880: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
1890: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
18a0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
18b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
18c0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
18d0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
18e0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
18f0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
1900: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
1910: 28 26 74 65 6d 70 31 29 3b 0a 20 20 7d 0a 20 20  (&temp1);.  }.  
1920: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 53  db->flags &= ~(S
1930: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1940: 64 7c 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  d|SQLITE_InternC
1950: 68 61 6e 67 65 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  hanges);.}../*.*
1960: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1970: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
1980: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
1990: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
19a0: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
19b0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
19c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
19d0: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
19e0: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
19f0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
1a00: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
1a10: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
1a20: 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63  id sqliteRollbac
1a30: 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  kInternalChanges
1a40: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
1a50: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
1a60: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
1a70: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
1a80: 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  teResetInternalS
1a90: 63 68 65 6d 61 28 64 62 29 3b 0a 20 20 7d 0a 7d  chema(db);.  }.}
1aa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ab0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
1ac0: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
1ad0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
1ae0: 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  iteCommitInterna
1af0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
1b00: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
1b10: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
1b20: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
1b30: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
1b40: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
1b50: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
1b60: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
1b70: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
1b80: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
1b90: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
1ba0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
1bb0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
1bc0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
1bd0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
1be0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
1bf0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
1c00: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
1c10: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
1c20: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
1c30: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
1c40: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
1c50: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
1c60: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
1c70: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
1c80: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
1c90: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
1ca0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
1cb0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
1cc0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
1cd0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
1ce0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cf0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
1d00: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
1d10: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1d20: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
1d30: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
1d40: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
1d50: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
1d60: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
1d70: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
1d80: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
1d90: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
1da0: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1db0: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
1dc0: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
1dd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1de0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1df0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1e00: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
1e10: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
1e20: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
1e30: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
1e40: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
1e50: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
1e60: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
1e70: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
1e80: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
1e90: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
1ea0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
1eb0: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1ec0: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
1ed0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
1ee0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
1ef0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69  ssert( pIndex->i
1f00: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
1f10: 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  || (pTable->iDb=
1f20: 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44  =0 && pIndex->iD
1f30: 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c  b==1) );.    sql
1f40: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1f50: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
1f60: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
1f70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
1f80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1f90: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
1fa0: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
1fb0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1fc0: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
1fd0: 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61  the db->aFKey ha
1fe0: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
1ff0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
2000: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
2010: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
2020: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
2030: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
2040: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
2050: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d   pTable->iDb<db-
2060: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
2070: 72 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69  rt( sqliteHashFi
2080: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
2090: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
20c0: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
20d0: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
20e0: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
20f0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2100: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2110: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2120: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2130: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2140: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2150: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2160: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2180: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2190: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
21a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
21b0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
21c0: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
21d0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
21e0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
21f0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2200: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2210: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
2220: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
2230: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
2240: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
2250: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
2260: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
2270: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
2280: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
2290: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
22a0: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
22b0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
22c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22d0: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
22e0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
22f0: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2300: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  ){.  Table *pOld
2310: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
2320: 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  pF2;.  int i = p
2330: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
2340: 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64   db!=0 );.  pOld
2350: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
2360: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2370: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2380: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2390: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
23a0: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
23b0: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
23c0: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
23d0: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
23e0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
23f0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2400: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2410: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73   pF2 = sqliteHas
2420: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69  hFind(&db->aDb[i
2430: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
2440: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28  o, nTo);.    if(
2450: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
2460: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2470: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2480: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
2490: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
24a0: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
24b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
24c0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
24d0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
24e0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
24f0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
2500: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
2510: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
2520: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
2530: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
2540: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
2550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
2560: 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  uct the name of 
2570: 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20  a user table or 
2580: 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b  index from a tok
2590: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  en..**.** Space 
25a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
25b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
25c0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
25d0: 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20   and must.** be 
25e0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
25f0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2600: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61  /.char *sqliteTa
2610: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
2620: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
2630: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2640: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
2650: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
2660: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
2670: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  te(zName);.  ret
2680: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
2690: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
26a0: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70  e to open the ap
26b0: 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72  propriate master
26c0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62   table.  The tab
26d0: 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c  le.** opened wil
26e0: 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54  l be SQLITE_MAST
26f0: 45 52 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ER for persisten
2700: 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a  t tables and .**
2710: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
2720: 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  TER for temporar
2730: 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74  y tables.  The t
2740: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a  able is opened.*
2750: 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a  * on cursor 0..*
2760: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65  /.void sqliteOpe
2770: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
2780: 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *v, int isTemp
2790: 29 7b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  ){.  sqliteVdbeA
27a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
27b0: 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a  er, isTemp, 0);.
27c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
27d0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
27e0: 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  e, 0, 2);.}../*.
27f0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
2800: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
2810: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2820: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
2830: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
2840: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
2850: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
2860: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
2870: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
2880: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2890: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
28a0: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
28b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
28c0: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
28d0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
28e0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
28f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
2900: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
2910: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
2920: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
2930: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
2940: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
2950: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
2960: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
2970: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
2980: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2990: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
29a0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
29b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
29c0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
29d0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
29e0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
29f0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
2a00: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
2a10: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
2a20: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
2a30: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
2a40: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
2a50: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
2a60: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
2a70: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
2a80: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
2a90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
2aa0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
2ab0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
2ac0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
2ad0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
2ae0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
2af0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
2b00: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
2b10: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
2b20: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
2b30: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
2b40: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
2b50: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
2b60: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
2b70: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
2b80: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
2b90: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
2ba0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2bb0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
2bc0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2bd0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
2be0: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
2bf0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
2c00: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
2c10: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
2c20: 20 76 69 65 77 20 74 6f 20 63 72 65 61 74 65 20   view to create 
2c30: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
2c40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2c50: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
2c60: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2c70: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
2c80: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2c90: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
2ca0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
2cb0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
2cc0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
2cd0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
2ce0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
2cf0: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72  ..  pParse->sFir
2d00: 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72  stToken = *pStar
2d10: 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  t;.  zName = sql
2d20: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
2d30: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
2d40: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
2d50: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
2d60: 72 73 65 2d 3e 69 44 62 3d 3d 31 20 29 20 69 73  rse->iDb==1 ) is
2d70: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
2d80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2d90: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
2da0: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
2db0: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
2dc0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
2dd0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2de0: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
2df0: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
2e00: 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   0) ){.    sqlit
2e10: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
2e20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2e30: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
2e40: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
2e50: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
2e60: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
2e70: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
2e80: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
2e90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ea0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
2eb0: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
2ec0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
2ee0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
2ef0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
2f00: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
2f10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f20: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
2f30: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
2f40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f50: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
2f60: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
2f70: 65 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  e, zName, 0) ){.
2f80: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
2f90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  (zName);.      r
2fa0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
2fb0: 0a 23 65 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20  .#endif. ..  /* 
2fc0: 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f  Before trying to
2fd0: 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   create a tempor
2fe0: 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20  ary table, make 
2ff0: 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66  sure the Btree f
3000: 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20  or.  ** holding 
3010: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3020: 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   is open..  */. 
3030: 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64   if( isTemp && d
3040: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
3050: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
3060: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
3070: 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
3080: 4f 70 65 6e 28 30 2c 20 30 2c 20 4d 41 58 5f 50  Open(0, 0, MAX_P
3090: 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31  AGES, &db->aDb[1
30a0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
30b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
30d0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
30e0: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
30f0: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
3100: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
3110: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
3120: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
3130: 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  ary tables", 0);
3140: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
3150: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
3160: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
3170: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
3180: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
3190: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31a0: 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  teBtreeBeginTran
31b0: 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
31c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
31f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3200: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
3210: 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
3220: 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
3230: 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
3240: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
3250: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
3260: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
3270: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3290: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
32a0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
32b0: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
32c0: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
32d0: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
32e0: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20   or table name. 
32f0: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
3300: 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f  message if it do
3310: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  es..  **.  ** If
3320: 20 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69   we are re-readi
3330: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
3340: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
3350: 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20  se of a schema. 
3360: 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61   ** change and a
3370: 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74   new permanent t
3380: 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68  able is found wh
3390: 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65  ose name collide
33a0: 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65  s with.  ** an e
33b0: 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72  xisting temporar
33c0: 79 20 74 61 62 6c 65 2c 20 74 68 61 74 20 69 73  y table, that is
33d0: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 0a 20   not an error.. 
33e0: 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   */.  pTable = s
33f0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
3400: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b, zName, 0);.  
3410: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26  if( pTable!=0 &&
3420: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 69   (pTable->iDb==i
3430: 73 54 65 6d 70 20 7c 7c 20 21 70 50 61 72 73 65  sTemp || !pParse
3440: 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20  ->initFlag) ){. 
3450: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
3460: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
3470: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
3480: 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  0, pName->z, pNa
3490: 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22  me->n,.        "
34a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
34b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
34c0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
34d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
34e0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
34f0: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
3500: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
3510: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
3520: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
3530: 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c   (pIdx->iDb==0 |
3540: 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  | !pParse->initF
3550: 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  lag) ){.    sqli
3560: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
3570: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
3580: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
3590: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 22  an index named "
35a0: 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  , .       zName,
35b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
35c0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
35d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
35e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
35f0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
3600: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
3610: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
3620: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
3630: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
3640: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
3650: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
3660: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
3670: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
3680: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3690: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
36a0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
36b0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
36c0: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
36d0: 20 69 73 54 65 6d 70 20 3f 20 31 20 3a 20 70 50   isTemp ? 1 : pP
36e0: 61 72 73 65 2d 3e 69 44 62 3b 0a 20 20 69 66 28  arse->iDb;.  if(
36f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
3700: 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74  le ) sqliteDelet
3710: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
3720: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
3730: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
3740: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
3750: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
3760: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
3770: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
3780: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
3790: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
37a0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
37b0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
37c0: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
37d0: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
37e0: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
37f0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
3800: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
3810: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
3820: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
3830: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
3840: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
3850: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
3860: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
3870: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
3880: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
3890: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
38a0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
38b0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
38c0: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
38d0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
38e0: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
38f0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
3900: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
3910: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
3920: 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73 71 6c  Flag && (v = sql
3930: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
3940: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  e))!=0 ){.    sq
3950: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
3960: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
3970: 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  0, isTemp);.    
3980: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
3990: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
39a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
39b0: 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  er, db->file_for
39c0: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  mat, 0);.      s
39d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
39e0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
39f0: 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
3a00: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
3a10: 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70  rTable(v, isTemp
3a20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
3a30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
3a40: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
3a50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3a60: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
3a70: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
3a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3a90: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
3aa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3ab0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
3ac0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
3ad0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
3ae0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
3af0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
3b00: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
3b10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
3b20: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
3b30: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
3b40: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
3b50: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
3b60: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3b70: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 53 74 61  ment.  sqliteSta
3b80: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
3b90: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
3ba0: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
3bb0: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
3bc0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3bd0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
3be0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
3bf0: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  iteAddColumn(Par
3c00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
3c10: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
3c20: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
3c30: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
3c40: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
3c50: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
3c60: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
3c70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
3c80: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c  teSetNString(&z,
3c90: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
3ca0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a  ->n, 0);.  if( z
3cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3cc0: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 29  sqliteDequote(z)
3cd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3ce0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
3cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
3d00: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
3d10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
3d20: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
3d30: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3d40: 72 72 4d 73 67 2c 20 22 64 75 70 6c 69 63 61 74  rrMsg, "duplicat
3d50: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22  e column name: "
3d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , z, 0);.      p
3d70: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
3d80: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3d90: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
3da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3db0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
3dc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
3dd0: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
3de0: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
3df0: 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d  oc( p->aCol, (p-
3e00: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
3e10: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
3e20: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20    if( aNew==0 ) 
3e30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61  return;.    p->a
3e40: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
3e50: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
3e60: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
3e70: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
3e80: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
3e90: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
3ea0: 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f   = z;.  pCol->so
3eb0: 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
3ec0: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43  _SO_NUM;.  p->nC
3ed0: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
3ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3ef0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3f00: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
3f10: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
3f20: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
3f30: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3f40: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
3f50: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
3f60: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
3f70: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
3f80: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
3f90: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
3fa0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
3fb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3fc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3fd0: 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75  d sqliteAddNotNu
3fe0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
3ff0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
4000: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
4010: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
4020: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4030: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4040: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4050: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
4060: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
4070: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
4080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4090: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
40a0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
40b0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
40c0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
40d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
40e0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
40f0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
4100: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
4110: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
4120: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
4130: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
4140: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
4150: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
4160: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
4170: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
4180: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
4190: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
41a0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
41b0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
41c0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
41d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
41e0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
41f0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
4200: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
4210: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
4220: 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54  sqliteAddColumnT
4230: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
4240: 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74  e, Token *pFirst
4250: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b  , Token *pLast){
4260: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
4270: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
4280: 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70  ;.  char *z, **p
4290: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
42a0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
42b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
42c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
42d0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
42e0: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
42f0: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
4300: 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20  aCol[i];.  pz = 
4310: 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20  &pCol->zType;.  
4320: 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41  n = pLast->n + A
4330: 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20  ddr(pLast->z) - 
4340: 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b  Addr(pFirst->z);
4350: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
4360: 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e  ing(pz, pFirst->
4370: 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20  z, n, 0);.  z = 
4380: 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  *pz;.  if( z==0 
4390: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
43a0: 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  i=j=0; z[i]; i++
43b0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  ){.    int c = z
43c0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73  [i];.    if( iss
43d0: 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e  pace(c) ) contin
43e0: 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  ue;.    z[j++] =
43f0: 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   c;.  }.  z[j] =
4400: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   0;.  if( pParse
4410: 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  ->db->file_forma
4420: 74 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43 6f 6c  t>=4 ){.    pCol
4430: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 71  ->sortOrder = sq
4440: 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28  liteCollateType(
4450: 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  z, n);.  }else{.
4460: 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72      pCol->sortOr
4470: 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
4480: 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  NUM;.  }.}../*.*
4490: 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65  * The given toke
44a0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
44b0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c   value for the l
44c0: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
44d0: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
44e0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
44f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4500: 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69  If "minusFlag" i
4510: 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65  s true, it.** me
4520: 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ans the value to
4530: 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65 64  ken was preceded
4540: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
4550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4560: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
4570: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
4580: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
4590: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
45a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
45b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
45c0: 20 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c   sqliteAddDefaul
45d0: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
45e0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61  arse, Token *pVa
45f0: 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67  l, int minusFlag
4600: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4610: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4620: 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  *pz;.  if( (p = 
4630: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4640: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4650: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4660: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4670: 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e  urn;.  pz = &p->
4680: 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20  aCol[i].zDflt;. 
4690: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
46a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
46b0: 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20  String(pz, "-", 
46c0: 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  1, pVal->z, pVal
46d0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
46e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
46f0: 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d  String(pz, pVal-
4700: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
4710: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71  .  }.  sqliteDeq
4720: 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a  uote(*pz);.}../*
4730: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
4740: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
4750: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
4760: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
4770: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
4780: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
4790: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
47a0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
47b0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
47c0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
47d0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
47e0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
47f0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
4800: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
4810: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
4820: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
4830: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
4840: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
4850: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
4860: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
4870: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
4880: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
4890: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
48a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
48b0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
48c0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
48d0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
48e0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
48f0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
4900: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
4910: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
4920: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
4930: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
4940: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
4950: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
4960: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
4970: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
4980: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
4990: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
49a0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
49b0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
49c0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
49d0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
49e0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
49f0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
4a00: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
4a10: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
4a20: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
4a30: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
4a40: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
4a50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
4a60: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
4a70: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4a80: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
4a90: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
4aa0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
4ab0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
4ac0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
4ad0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
4ae0: 69 64 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d  id sqliteAddPrim
4af0: 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50  aryKey(Parse *pP
4b00: 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
4b10: 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  ist, int onError
4b20: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
4b30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
4b40: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
4b50: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
4b60: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Col = -1;.  if( 
4b70: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
4b80: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
4b90: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
4ba0: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
4bb0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
4bc0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
4bd0: 20 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61   "table \"", pTa
4be0: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
4bf0: 20 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20     "\" has more 
4c00: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
4c10: 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70   key", 0);.    p
4c20: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4c30: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
4c40: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
4c50: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
4c60: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
4c70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
4c80: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
4c90: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
4ca0: 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a  List->nId==1 ){.
4cb0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
4cc0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
4cd0: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
4ce0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
4cf0: 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e  p(pList->a[0].zN
4d00: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
4d10: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
4d20: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
4d30: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
4d40: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
4d50: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
4d60: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
4d70: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
4d80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4d90: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20  >file_format>=1 
4da0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  && .           z
4db0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74  Type && sqliteSt
4dc0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
4dd0: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
4de0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
4df0: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
4e00: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
4e10: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
4e20: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
4e30: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
4e40: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
4e50: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c  0, 0, 0);.    pL
4e60: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
4e70: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
4e80: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
4e90: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
4ea0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
4eb0: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
4ec0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
4ed0: 20 74 79 70 65 20 67 69 76 65 6e 20 61 20 74 79   type given a ty
4ee0: 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  pe name..**.** T
4ef0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  he collation typ
4f00: 65 20 69 73 20 74 65 78 74 20 28 53 51 4c 49 54  e is text (SQLIT
4f10: 45 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74 68  E_SO_TEXT) if th
4f20: 65 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63  e type.** name c
4f30: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61 72  ontains the char
4f40: 61 63 74 65 72 20 73 74 72 65 61 6d 20 22 74 65  acter stream "te
4f50: 78 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72  xt" or "blob" or
4f60: 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79  .** "clob".  Any
4f70: 20 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d 65   other type name
4f80: 20 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73 20   is collated as 
4f90: 6e 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49  numeric.** (SQLI
4fa0: 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69  TE_SO_NUM)..*/.i
4fb0: 6e 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65  nt sqliteCollate
4fc0: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
4fd0: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
4fe0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  e){.  int i;.  f
4ff0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 2d  or(i=0; i<nType-
5000: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69  1; i++){.    swi
5010: 74 63 68 28 20 7a 54 79 70 65 5b 69 5d 20 29 7b  tch( zType[i] ){
5020: 0a 20 20 20 20 20 20 63 61 73 65 20 27 62 27 3a  .      case 'b':
5030: 0a 20 20 20 20 20 20 63 61 73 65 20 27 42 27 3a  .      case 'B':
5040: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
5050: 3c 6e 54 79 70 65 2d 33 20 26 26 20 73 71 6c 69  <nType-3 && sqli
5060: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70  teStrNICmp(&zTyp
5070: 65 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d  e[i],"blob",4)==
5080: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
5090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
50a0: 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TEXT;.        }.
50b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
50c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
50d0: 65 20 27 63 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'c':.      cas
50e0: 65 20 27 43 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'C': {.       
50f0: 20 69 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26   if( i<nType-3 &
5100: 26 20 28 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  & (sqliteStrNICm
5110: 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 68 61  p(&zType[i],"cha
5120: 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20 20  r",4)==0 ||.    
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72         sqliteStr
5150: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c  NICmp(&zType[i],
5160: 22 63 6c 6f 62 22 2c 34 29 3d 3d 30 29 0a 20 20  "clob",4)==0).  
5170: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
5180: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5190: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  _SO_TEXT;.      
51a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
51b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
51c0: 20 63 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20   case 'x':.     
51d0: 20 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20   case 'X': {.   
51e0: 20 20 20 20 20 69 66 28 20 69 3e 3d 32 20 26 26       if( i>=2 &&
51f0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
5200: 26 7a 54 79 70 65 5b 69 2d 32 5d 2c 22 74 65 78  &zType[i-2],"tex
5210: 74 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t",4)==0 ){.    
5220: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5230: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
5240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
5250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5260: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5270: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
52a0: 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  SO_NUM;.}../*.**
52b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
52c0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
52d0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
52e0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
52f0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
5300: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5310: 2e 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63  .  A "COLLATE" c
5320: 6c 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65  lause has.** bee
5330: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
5340: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
5350: 65 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d  e sets the Colum
5360: 6e 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a  n.sortOrder on.*
5370: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
5380: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
5390: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
53a0: 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c  id sqliteAddColl
53b0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
53c0: 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54  Parse, int collT
53d0: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
53e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
53f0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5400: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5410: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5420: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5430: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73  0 ) p->aCol[i].s
5440: 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54  ortOrder = collT
5450: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ype;.}../*.** Co
5460: 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77  me up with a new
5470: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f   random value fo
5480: 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  r the schema coo
5490: 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a  kie.  Make sure.
54a0: 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ** the new value
54b0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
54c0: 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a  om the old..**.*
54d0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
54e0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
54f0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
5500: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
5510: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
5520: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
5530: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
5540: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
5550: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
5560: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
5570: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
5580: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
5590: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
55a0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
55b0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
55c0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
55d0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
55e0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
55f0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
5600: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
5610: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
5620: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
5630: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
5640: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
5650: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
5660: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
5670: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
5680: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
5690: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
56a0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
56b0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
56c0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
56d0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
56e0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
56f0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
5700: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
5710: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
5720: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
5730: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
5740: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
5750: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
5760: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61  /.void sqliteCha
5770: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
5780: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a   *db, Vdbe *v){.
5790: 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63    if( db->next_c
57a0: 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30  ookie==db->aDb[0
57b0: 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ].schema_cookie 
57c0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  ){.    db->next_
57d0: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62  cookie = db->aDb
57e0: 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  [0].schema_cooki
57f0: 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  e + sqliteRandom
5800: 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20  Byte() + 1;.    
5810: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
5820: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
5830: 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  s;.    sqliteVdb
5840: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5850: 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63  eger, db->next_c
5860: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73  ookie, 0);.    s
5870: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5880: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
5890: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
58a0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
58b0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
58c0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
58d0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
58e0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
58f0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
5900: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
5910: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
5920: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
5930: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
5940: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  rminator..*/.sta
5950: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
5960: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
5970: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  z){.  int n;.  i
5980: 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30  nt needQuote = 0
5990: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
59a0: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
59b0: 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20  if( *z=='\'' ){ 
59c0: 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31  n++; needQuote=1
59d0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
59e0: 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32   n + needQuote*2
59f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
5a00: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
5a10: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
5a20: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
5a30: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
5a40: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
5a50: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
5a60: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
5a70: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
5a80: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a   char *zIdent){.
5a90: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
5aa0: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
5ab0: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
5ac0: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
5ad0: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
5ae0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
5af0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
5b00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
5b10: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
5b20: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
5b30: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
5b50: 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43  | sqliteKeywordC
5b60: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
5b70: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
5b80: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
5b90: 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d  = '\'';.  for(j=
5ba0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
5bb0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
5bc0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
5bd0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
5be0: 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  \'' ) z[i++] = '
5bf0: 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  \'';.  }.  if( n
5c00: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
5c10: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d  ] = '\'';.  z[i]
5c20: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
5c30: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
5c40: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
5c50: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
5c60: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
5c70: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
5c80: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
5c90: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
5ca0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
5cb0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
5cc0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5cd0: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5ce0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
5cf0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
5d00: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
5d10: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
5d20: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
5d30: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
5d40: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
5d50: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
5d60: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    n = 0;.  for(i
5d70: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
5d80: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
5d90: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f  entLength(p->aCo
5da0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  l[i].zName);.  }
5db0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
5dc0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
5dd0: 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20   if( n<40 ){.   
5de0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
5df0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
5e00: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
5e10: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
5e20: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
5e30: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
5e40: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
5e50: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
5e60: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
5e70: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
5e80: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
5e90: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
5ea0: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
5eb0: 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20  Stmt, p->iDb==1 
5ec0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
5ed0: 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45  ABLE " : "CREATE
5ee0: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
5ef0: 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a   strlen(zStmt);.
5f00: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
5f10: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
5f20: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
5f30: 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '(';.  for(i=0; 
5f40: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
5f50: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
5f60: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
5f70: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
5f80: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
5f90: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
5fa0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
5fb0: 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &k, p->aCol[i].z
5fc0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72  Name);.  }.  str
5fd0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
5fe0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
5ff0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
6000: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6010: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
6020: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
6030: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
6040: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6050: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
6060: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
6070: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
6080: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
6090: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
60a0: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
60b0: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
60c0: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
60d0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
60e0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
60f0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
6100: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
6110: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
6120: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
6130: 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69  k,.** unless thi
6140: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
6150: 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c   table or initFl
6160: 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69  ag==1.  When ini
6170: 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20  tFlag==1,.** it 
6180: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
6190: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
61a0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
61b0: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
61c0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
61d0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
61e0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
61f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
6200: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
6210: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
6220: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
6230: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6240: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
6250: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
6260: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
6270: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
6280: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
6290: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
62a0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
62b0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
62c0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
62d0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
62e0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
62f0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
6300: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
6310: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
6320: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
6330: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
6340: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
6350: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
6360: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
6370: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
6380: 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  d sqliteEndTable
6390: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
63a0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
63b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
63c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
63d0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
63e0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
63f0: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
6400: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
6410: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
6420: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
6430: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
6440: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
6450: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
6460: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  urn;..  /* If th
6470: 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72  e table is gener
6480: 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45  ated from a SELE
6490: 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75  CT, then constru
64a0: 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ct the.  ** list
64b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20   of columns and 
64c0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
64d0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
64e0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
64f0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20   Table *pSelTab 
6500: 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65  = sqliteResultSe
6510: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
6520: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
6530: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
6540: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
6550: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
6560: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  =0 );.    p->nCo
6570: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
6580: 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  l;.    p->aCol =
6590: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
65a0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
65b0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
65c0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
65d0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
65e0: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
65f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
6600: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20  e initFlag is 1 
6610: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
6620: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
6630: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
6640: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
6650: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
6660: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
6670: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
6680: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
6690: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
66a0: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
66b0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
66c0: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
66d0: 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65   from the pParse
66e0: 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  ->newTnum field.
66f0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
6700: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
6710: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
6720: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
6730: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
6740: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
6750: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
6760: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50      p->tnum = pP
6770: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20  arse->newTnum;. 
6780: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
6790: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
67a0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
67b0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
67c0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
67d0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
67e0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
67f0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
6800: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
6810: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
6820: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
6830: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
6840: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
6850: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
6860: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
6870: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
6880: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
6890: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
68a0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
68b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
68c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
68d0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
68e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
68f0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
6900: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
6910: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
6920: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
6930: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  ;.    if( p->pSe
6940: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
6950: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
6960: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ble */.      sql
6970: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6980: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
6990: 30 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20  0, p->iDb);.    
69a0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
69b0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
69c0: 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  r *)&p->tnum, P3
69d0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
69e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
69f0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   view */.      s
6a00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6a10: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6a20: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
6a30: 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  ->tnum = 0;.    
6a40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6a50: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
6a60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6a70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
6a80: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
6a90: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
6aa0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6ab0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6ac0: 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33   -1, "table", P3
6ad0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65  _STATIC);.    }e
6ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
6af0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6b00: 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f   -1, "view", P3_
6b10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
6b20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6b30: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6b40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6b50: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6b60: 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  , -1, p->zName, 
6b70: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6b80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6b90: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
6ba0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6bb0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6bc0: 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  1, p->zName, P3_
6bd0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
6be0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6bf0: 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20  OP_Dup, 4, 0);. 
6c00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6c10: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6c20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6c30: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6c40: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
6c50: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
6c60: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
6c70: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
6c80: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6c90: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e  geP3(v, -1, z, n
6ca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6cb0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(z);.    }els
6cc0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
6cd0: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
6ce0: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
6cf0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
6d00: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
6d10: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
6d20: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6d30: 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73  v, -1, pParse->s
6d40: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29  FirstToken.z, n)
6d50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6d60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6d70: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
6d80: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6d90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6da0: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
6db0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62  .    if( !p->iDb
6dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6dd0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
6de0: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
6df0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6e00: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
6e10: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  );.    if( pSele
6e20: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
6e30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6e40: 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44  P_Integer, p->iD
6e50: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
6e60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6e70: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
6e80: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
6e90: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
6ea0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
6eb0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
6ec0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
6ed0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
6ee0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
6ef0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6f00: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
6f10: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
6f20: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
6f30: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
6f40: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
6f50: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
6f60: 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50  explain==0 && pP
6f70: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
6f80: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
6f90: 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65  ;.    FKey *pFKe
6fa0: 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  y;.    pOld = sq
6fb0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
6fc0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
6fd0: 74 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20  tblHash, .      
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20        p->zName, 
7000: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
7010: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
7020: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
7030: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
7040: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
7050: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
7060: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
7070: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
7090: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
70a0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
70b0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
70c0: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
70d0: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
70e0: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
70f0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
7100: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
7110: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
7120: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
7130: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71  , nTo);.      sq
7140: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
7150: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
7160: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
7170: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
7180: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
7190: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
71a0: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
71b0: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
71c0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
71d0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
71e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
71f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
7200: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
7210: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
7220: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
7230: 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  eCreateView(.  P
7240: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7250: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7260: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
7270: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
7280: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
7290: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
72a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
72b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
72c0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  ,      /* The to
72d0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
72e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
72f0: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
7300: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
7310: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7320: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
7330: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
7340: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  */.  int isTemp 
7350: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
7360: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
7370: 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  view */.){.  Tab
7380: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
7390: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
73a0: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 0a  .  Token sEnd;..
73b0: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
73c0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
73d0: 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70  n, pName, isTemp
73e0: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
73f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
7400: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
7410: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
7420: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
7430: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
7440: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
7450: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
7460: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
7470: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
7480: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
7490: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
74a0: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
74b0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
74c0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
74d0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
74e0: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
74f0: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
7500: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
7510: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
7520: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
7530: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
7540: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
7550: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
7560: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
7570: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7580: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
7590: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  t);.  sqliteSele
75a0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
75b0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
75c0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
75d0: 20 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43    sqliteViewGetC
75e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
75f0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
7600: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
7610: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
7620: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
7630: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
7640: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
7650: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
7660: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
7670: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
7680: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
7690: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
76a0: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
76b0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
76c0: 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45  ;.  n = ((int)sE
76d0: 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65  nd.z) - (int)pBe
76e0: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42  gin->z;.  z = pB
76f0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
7700: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
7710: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
7720: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
7730: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
7740: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
7750: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
7760: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
7770: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
7780: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
7790: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
77a0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
77b0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
77c0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
77d0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
77e0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
77f0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
7800: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
7810: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
7820: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
7830: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
7840: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
7850: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
7860: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
7870: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
7880: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
7890: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
78a0: 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  re->zErrMsg..*/.
78b0: 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47 65  int sqliteViewGe
78c0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
78d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
78e0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78  e *pTable){.  Ex
78f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
7900: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
7910: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
7920: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
7930: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
7940: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
7950: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
7960: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
7970: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
7980: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
7990: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
79a0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
79b0: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
79c0: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
79d0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
79e0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
79f0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
7a00: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
7a10: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
7a20: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7a30: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
7a40: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
7a50: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
7a60: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
7a70: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
7a80: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
7a90: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
7aa0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
7ab0: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
7ac0: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
7ad0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
7ae0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
7af0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
7b00: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
7b10: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
7b20: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
7b30: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
7b40: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
7b50: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
7b60: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
7b70: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
7b80: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
7b90: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
7ba0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
7bb0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
7bc0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
7bd0: 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20  rrMsg, "view ", 
7be0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20  pTable->zName,. 
7bf0: 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69 72          " is cir
7c00: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
7c10: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
7c20: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
7c30: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
7c40: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
7c50: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
7c60: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
7c70: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
7c80: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
7c90: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
7ca0: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
7cb0: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
7cc0: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
7cd0: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
7ce0: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
7cf0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
7d00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65  call to sqliteRe
7d10: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7d20: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
7d30: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
7d40: 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74  nts in this list
7d50: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e  .  But we will n
7d60: 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  eed to restore t
7d70: 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63  he list.  ** bac
7d80: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7d90: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
7da0: 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77  afterwards, so w
7db0: 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66  e save a copy of
7dc0: 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e  .  ** the origin
7dd0: 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20  al in pEList..  
7de0: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  */.  pEList = pS
7df0: 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53  el->pEList;.  pS
7e00: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  el->pEList = sql
7e10: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
7e20: 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53  EList);.  if( pS
7e30: 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b  el->pEList==0 ){
7e40: 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  .    pSel->pELis
7e50: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
7e60: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61  return 1;  /* Ma
7e70: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
7e80: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   }.  pTable->nCo
7e90: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
7ea0: 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74  b = sqliteResult
7eb0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
7ec0: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
7ed0: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
7ee0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
7ef0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
7f00: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
7f10: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
7f20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
7f30: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
7f40: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
7f50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
7f60: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
7f70: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
7f80: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
7f90: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  );.    pParse->d
7fa0: 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69  b->aDb[pTable->i
7fb0: 44 62 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  Db].flags |= SQL
7fc0: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
7fd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7fe0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
7ff0: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
8000: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55  .  sqliteSelectU
8010: 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73  nbind(pSel);.  s
8020: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
8030: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
8040: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
8050: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
8060: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a  turn nErr;  .}..
8070: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
8080: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
8090: 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c  m the VIEW pTabl
80a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
80b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
80c0: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68  whenever any oth
80d0: 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  er table or view
80e0: 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a   is modified..**
80f0: 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64   The view passed
8100: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
8110: 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20  ne might depend 
8120: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
8130: 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65  rectly.** on the
8140: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c   modified or del
8150: 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65  eted table so we
8160: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74   need to clear t
8170: 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a  he old column.**
8180: 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74   names so that t
8190: 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  hey will be reco
81a0: 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
81b0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
81c0: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
81d0: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
81e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
81f0: 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54   pTable==0 || pT
8200: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  able->pSelect==0
8210: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8220: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30   pTable->nCol==0
8230: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8240: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
8250: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8260: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8270: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
8280: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8290: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
82a0: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
82b0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
82c0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
82d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
82e0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
82f0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
8300: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
8310: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
8320: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
8330: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
8340: 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 73 74 61  ery VIEW..*/.sta
8350: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
8360: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
8370: 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  te *db, int idx)
8380: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8390: 0a 20 20 69 66 28 20 28 64 62 2d 3e 61 44 62 5b  .  if( (db->aDb[
83a0: 69 64 78 5d 2e 66 6c 61 67 73 20 26 20 53 51 4c  idx].flags & SQL
83b0: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
83c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
83d0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
83e0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
83f0: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
8400: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
8410: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
8420: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
8430: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
8440: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
8450: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
8460: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
8470: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
8480: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44    }.  }.  db->aD
8490: 62 5b 69 64 78 5d 2e 66 6c 61 67 73 20 26 3d 20  b[idx].flags &= 
84a0: 7e 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56  ~SQLITE_UnresetV
84b0: 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iews;.}../*.** G
84c0: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f  iven a token, lo
84d0: 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69  ok up a table wi
84e0: 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49  th that name.  I
84f0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61  f not found, lea
8500: 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66  ve.** an error f
8510: 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  or the parser to
8520: 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e   find and return
8530: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20   NULL..*/.Table 
8540: 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d  *sqliteTableFrom
8550: 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61  Token(Parse *pPa
8560: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
8570: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
8580: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
8590: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
85a0: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
85b0: 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28  ken(pTok);.  if(
85c0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
85d0: 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73  rn 0;.  pTab = s
85e0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70  qliteFindTable(p
85f0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
8600: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  , 0);.  sqliteFr
8610: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ee(zName);.  if(
8620: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
8630: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
8640: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
8650: 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  g, "no such tabl
8660: 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  e: ", 0, .      
8670: 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d    pTok->z, pTok-
8680: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
8690: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a  se->nErr++;.  }.
86a0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
86b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
86c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
86d0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
86e0: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
86f0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
8700: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
8710: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
8720: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
8730: 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c  d sqliteDropTabl
8740: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8750: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69   Token *pName, i
8760: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
8770: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56  ble *pTable;.  V
8780: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61  dbe *v;.  int ba
8790: 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  se;.  sqlite *db
87a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
87b0: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
87c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
87d0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
87e0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
87f0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
8800: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
8810: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
8820: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
8830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 44 62 20  ) return;.  iDb 
8840: 3d 20 70 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 23  = pTable->iDb;.#
8850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8860: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
8870: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74  .  if( sqliteAut
8880: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
8890: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53 43  QLITE_DELETE, SC
88a0: 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 6c  HEMA_TABLE(pTabl
88b0: 65 2d 3e 69 44 62 29 2c 30 29 29 7b 0a 20 20 20  e->iDb),0)){.   
88c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7b   return;.  }.  {
88d0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
88e0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
88f0: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
8900: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
8910: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
8920: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
8930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8940: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
8950: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
8960: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8970: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
8980: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
8990: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
89a0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
89b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
89c0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
89d0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
89e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
89f0: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
8a00: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 6c 65  se, code, pTable
8a10: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  ->zName, 0) ){. 
8a20: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8a30: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
8a40: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
8a50: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
8a60: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
8a70: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
8a80: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
8a90: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
8aa0: 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  le->readOnly ){.
8ab0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
8ac0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8ad0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
8ae0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a  pTable->zName, .
8af0: 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74         " may not
8b00: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
8b10: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
8b20: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
8b30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69  ;.  }.  if( isVi
8b40: 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  ew && pTable->pS
8b50: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
8b60: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
8b70: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
8b80: 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
8b90: 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
8ba0: 65 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c  e ",.      pTabl
8bb0: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
8bc0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8be0: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
8bf0: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
8c00: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
8c10: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
8c20: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65  e->zErrMsg, "use
8c30: 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
8c40: 6c 65 74 65 20 76 69 65 77 20 22 2c 0a 20 20 20  lete view ",.   
8c50: 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65     pTable->zName
8c60: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
8c70: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
8c80: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
8c90: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
8ca0: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
8cb0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
8cc0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
8cd0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
8ce0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
8cf0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
8d00: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
8d10: 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d  beOp dropTable[]
8d20: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
8d30: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
8d40: 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(8),  0},.   
8d50: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
8d60: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
8d70: 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20   0}, /* 1 */.   
8d80: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
8d90: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
8da0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
8db0: 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30  MemLoad,    1, 0
8dc0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
8dd0: 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
8de0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32  Column,     0, 2
8df0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
8e00: 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20     { OP_Ne,     
8e10: 20 20 20 20 30 2c 20 41 44 44 52 28 37 29 2c 20      0, ADDR(7), 
8e20: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
8e30: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
8e40: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
8e50: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
8e60: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
8e70: 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20   0}, /* 7 */.   
8e80: 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   };.    Index *p
8e90: 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72  Idx;.    Trigger
8ea0: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
8eb0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
8ec0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
8ed0: 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  , 0, pTable->iDb
8ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65  );.    sqliteOpe
8ef0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
8f00: 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20  pTable->iDb);.  
8f10: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
8f20: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
8f30: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
8f40: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a   being dropped *
8f50: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
8f60: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
8f70: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
8f80: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
8f90: 53 72 63 4c 69 73 74 20 2a 70 4e 6d 3b 0a 20 20  SrcList *pNm;.  
8fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
8fb0: 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  gger->iDb==pTabl
8fc0: 65 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20  e->iDb );.      
8fd0: 70 4e 6d 20 3d 20 73 71 6c 69 74 65 53 72 63 4c  pNm = sqliteSrcL
8fe0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20  istAppend(0, 0, 
8ff0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 6d 2d 3e 61  0);.      pNm->a
9000: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [0].zName = sqli
9010: 74 65 53 74 72 44 75 70 28 70 54 72 69 67 67 65  teStrDup(pTrigge
9020: 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  r->name);.      
9030: 70 4e 6d 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  pNm->a[0].zDatab
9040: 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ase = sqliteStrD
9050: 75 70 28 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c  up(db->aDb[pTabl
9060: 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  e->iDb].zName);.
9070: 20 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70        sqliteDrop
9080: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
9090: 70 4e 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pNm, 1);.      i
90a0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
90b0: 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  in ){.        pT
90c0: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
90d0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
90e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
90f0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65  Trigger = pTable
9100: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
9110: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 61    }.    }.    ba
9120: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
9130: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
9140: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
9150: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
9160: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
9170: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
9180: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
9190: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
91a0: 6c 65 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 20  le->iDb ){.     
91b0: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
91c0: 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20  kie(db, v);.    
91d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
91e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
91f0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
9200: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
9210: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9220: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
9230: 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20  , pTable->tnum, 
9240: 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20  pTable->iDb);.  
9250: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
9260: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  ble->pIndex; pId
9270: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9280: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
9290: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
92a0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64   OP_Destroy, pId
92b0: 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d  x->tnum, pTable-
92c0: 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >iDb);.      }. 
92d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
92e0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
92f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
9300: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
9310: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
9320: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
9330: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  e..  **.  ** Exc
9340: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
9350: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
9360: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
9370: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
9380: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
9390: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
93a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
93b0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
93c0: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
93d0: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
93e0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20  db, pTable);.   
93f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
9400: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
9410: 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  es;.  }.  sqlite
9420: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
9430: 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
9440: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
9450: 73 74 72 75 63 74 73 20 61 20 50 33 20 73 74 72  structs a P3 str
9460: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
9470: 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65   an OP_MakeIdxKe
9480: 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  y.** opcode and 
9490: 61 64 64 73 20 74 68 61 74 20 50 33 20 73 74 72  adds that P3 str
94a0: 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  ing to the most 
94b0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
94c0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  d instruction.**
94d0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
94e0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33  machine.  The P3
94f0: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73   string consists
9500: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61   of a single cha
9510: 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61  racter.** for ea
9520: 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ch column in the
9530: 20 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74   index pIdx of t
9540: 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74  able pTab.  If t
9550: 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a  he column uses.*
9560: 2a 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74  * a numeric sort
9570: 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
9580: 20 50 33 20 73 74 72 69 6e 67 20 63 68 61 72 61   P3 string chara
9590: 63 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  cter correspondi
95a0: 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f  ng to.** that co
95b0: 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66  lumn is 'n'.  If
95c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73   the column uses
95d0: 20 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64   a text sort ord
95e0: 65 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  er, then the.** 
95f0: 50 33 20 73 74 72 69 6e 67 20 69 73 20 27 74 27  P3 string is 't'
9600: 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61  .  See the OP_Ma
9610: 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20  keIdxKey opcode 
9620: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
9630: 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20  r.** additional 
9640: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65  information.  Se
9650: 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74  e also the sqlit
9660: 65 41 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f  eAddKeyType() ro
9670: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
9680: 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79  qliteAddIdxKeyTy
9690: 70 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65  pe(Vdbe *v, Inde
96a0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72  x *pIdx){.  char
96b0: 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65   *zType;.  Table
96c0: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
96d0: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   n;.  assert( pI
96e0: 64 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70  dx!=0 && pIdx->p
96f0: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54  Table!=0 );.  pT
9700: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
9710: 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e  e;.  n = pIdx->n
9720: 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20  Column;.  zType 
9730: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
9740: 77 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  w( n+1 );.  if( 
9750: 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72  zType==0 ) retur
9760: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
9770: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
9780: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
9790: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
97a0: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
97b0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
97c0: 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  l );.    if( (pT
97d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
97e0: 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54  ortOrder & SQLIT
97f0: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d  E_SO_TYPEMASK)==
9800: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29  SQLITE_SO_TEXT )
9810: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d  {.      zType[i]
9820: 20 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73   = 't';.    }els
9830: 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69  e{.      zType[i
9840: 5d 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20  ] = 'n';.    }. 
9850: 20 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20   }.  zType[n] = 
9860: 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43  0;.  sqliteVdbeC
9870: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
9880: 54 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69  Type, n);.  sqli
9890: 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d  teFree(zType);.}
98a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
98b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
98c0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
98d0: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
98e0: 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
98f0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9900: 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
9910: 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
9920: 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
9930: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
9940: 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
9950: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
9960: 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
9970: 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
9980: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
9990: 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
99a0: 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
99b0: 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
99c0: 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
99d0: 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
99e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
99f0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
9a00: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
9a10: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
9a20: 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
9a30: 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
9a40: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
9a50: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
9a60: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
9a70: 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
9a80: 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
9a90: 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
9aa0: 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
9ab0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
9ac0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
9ad0: 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
9ae0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
9af0: 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
9b00: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
9b10: 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
9b20: 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
9b30: 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
9b40: 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
9b50: 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
9b60: 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
9b70: 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
9b80: 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 45  ** until sqliteE
9b90: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
9ba0: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
9bb0: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
9bc0: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
9bd0: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
9be0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
9bf0: 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  eDeferForeignKey
9c00: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
9c10: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
9c20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9c30: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
9c40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9c50: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
9c60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9c70: 20 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f   IdList *pFromCo
9c80: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
9c90: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
9ca0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
9cb0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
9cc0: 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
9cd0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
9ce0: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
9cf0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f  .  IdList *pToCo
9d00: 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  l,      /* Colum
9d10: 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
9d20: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
9d30: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
9d40: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
9d50: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
9d60: 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  s. */.){.  Table
9d70: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
9d80: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
9d90: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
9da0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
9db0: 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46  r *z;.  FKey *pF
9dc0: 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Key = 0;..  asse
9dd0: 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
9de0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
9df0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
9e00: 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
9e10: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
9e20: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
9e30: 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
9e40: 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
9e50: 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
9e60: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
9e70: 49 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Id!=1 ){.      s
9e80: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
9e90: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
9ea0: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
9eb0: 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  n ", -1,.       
9ec0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
9ed0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20 20  zName, -1, .    
9ee0: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
9ef0: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
9f00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
9f10: 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20   ", -1,.        
9f20: 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c   pTo->z, pTo->n,
9f30: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
9f40: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
9f50: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
9f60: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
9f70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
9f80: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
9f90: 6e 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  nId!=pFromCol->n
9fa0: 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Id ){.    sqlite
9fb0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
9fc0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20  e->zErrMsg, .   
9fd0: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
9fe0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
9ff0: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
a000: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
a010: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
a020: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
a030: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 2c  ferenced table",
a040: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
a050: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
a060: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
a070: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
a080: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d  romCol->nId;.  }
a090: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
a0a0: 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c  f(*pFKey) + nCol
a0b0: 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
a0c0: 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
a0d0: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
a0e0: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
a0f0: 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64  0; i<pToCol->nId
a100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
a110: 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
a120: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
a130: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
a140: 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
a150: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
a160: 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
a170: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
a180: 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
a190: 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
a1a0: 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
a1b0: 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
a1c0: 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
a1d0: 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
a1e0: 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
a1f0: 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
a200: 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
a210: 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
a220: 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
a230: 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
a240: 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
a250: 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
a260: 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
a270: 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
a280: 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
a290: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
a2a0: 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
a2b0: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
a2c0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
a2d0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
a2e0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
a2f0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a300: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
a310: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
a320: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
a330: 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
a340: 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
a350: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
a360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
a370: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
a380: 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
a390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a3a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a3b0: 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
a3c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a3d0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
a3e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
a3f0: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22  known column \""
a400: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
a410: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
a420: 65 2c 20 22 5c 22 20 69 6e 20 66 6f 72 65 69 67  e, "\" in foreig
a430: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
a440: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
a450: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
a460: 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
a470: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
a480: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
a490: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
a4a0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
a4b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
a4c0: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
a4d0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
a4e0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
a4f0: 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
a500: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
a510: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
a520: 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
a530: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
a540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
a550: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
a560: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
a570: 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
a580: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
a590: 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
a5a0: 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
a5b0: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
a5c0: 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
a5d0: 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
a5e0: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
a5f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
a600: 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
a610: 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
a620: 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
a630: 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
a640: 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
a650: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
a660: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
a670: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
a680: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
a690: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
a6a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a6b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
a6c0: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
a6d0: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
a6e0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
a6f0: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
a700: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
a710: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
a720: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
a730: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
a740: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
a750: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
a760: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
a770: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
a780: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
a790: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
a7a0: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
a7b0: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
a7c0: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
a7d0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
a7e0: 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  teDeferForeignKe
a7f0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
a800: 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
a810: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
a820: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
a830: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
a840: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
a850: 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
a860: 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
a870: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
a880: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
a890: 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f  isDeferred;.}../
a8a0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
a8b0: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
a8c0: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
a8d0: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
a8e0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
a8f0: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
a900: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
a910: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
a920: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
a930: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
a940: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
a950: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
a960: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
a970: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
a980: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
a990: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
a9a0: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
a9b0: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
a9c0: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
a9d0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
a9e0: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
a9f0: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
aa00: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
aa10: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
aa20: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
aa30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
aa40: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
aa50: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
aa60: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
aa70: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
aa80: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
aa90: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
aaa0: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
aab0: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
aac0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
aad0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
aae0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
aaf0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
ab00: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
ab10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61  .void sqliteCrea
ab20: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
ab30: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
ab40: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
ab50: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
ab60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
ab70: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
ab80: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79   the index.  May
ab90: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
aba0: 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f  cList *pTable, /
abb0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
abc0: 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55  ble to index.  U
abd0: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
abe0: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49  able if 0 */.  I
abf0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  dList *pList,   
ac00: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
ac10: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
ac20: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
ac30: 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
ac40: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
ac50: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
ac60: 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  OE_None */.  int
ac70: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
ac80: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
ac90: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
aca0: 65 78 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ex */.  Token *p
acb0: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
acc0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
acd0: 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
ace0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
acf0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
ad00: 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  nd      /* The "
ad10: 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
ad20: 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
ad30: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
ad40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
ad50: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
ad60: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
ad70: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
ad80: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
ad90: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
ada0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
adb0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
adc0: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
add0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
ade0: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
adf0: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
ae00: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
ae10: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
ae20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ae30: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
ae40: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
ae50: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ae60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
ae70: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
ae80: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
ae90: 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
aea0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
aeb0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  /.  if( pTable!=
aec0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
aed0: 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20   pName!=0 );.   
aee0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
aef0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20  >nSrc==1 );.    
af00: 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61  pTab =  sqliteTa
af10: 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70  bleNameToTable(p
af20: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
af30: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
af40: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[0].zName, pTa
af50: 62 6c 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ble->a[0].zDatab
af60: 61 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ase);.  }else{. 
af70: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
af80: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
af90: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
afa0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
afb0: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
afc0: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
afd0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
afe0: 3b 0a 20 20 69 66 28 20 21 69 73 54 65 6d 70 20  ;.  if( !isTemp 
aff0: 26 26 20 28 70 54 61 62 2d 3e 72 65 61 64 4f 6e  && (pTab->readOn
b000: 6c 79 20 7c 7c 20 70 54 61 62 2d 3e 69 44 62 3e  ly || pTab->iDb>
b010: 3d 32 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =2) ){.    sqlit
b020: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b030: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
b040: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
b050: 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79  me, .      " may
b060: 20 6e 6f 74 20 68 61 76 65 20 6e 6f 6e 2d 74 65   not have non-te
b070: 6d 70 6f 72 61 72 79 20 69 6e 64 69 63 65 73 20  mporary indices 
b080: 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  added", 0);.    
b090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
b0a0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b0b0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
b0c0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
b0d0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
b0e0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b0f0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69  se->zErrMsg, "vi
b100: 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
b110: 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20  ndexed", 0);.   
b120: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
b130: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
b140: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
b150: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 44 62  .  if( pTab->iDb
b160: 3d 3d 31 20 29 7b 0a 20 20 20 20 69 73 54 65 6d  ==1 ){.    isTem
b170: 70 20 3d 20 31 3b 0a 20 20 7d 0a 0a 0a 23 69 66  p = 1;.  }...#if
b180: 20 30 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20   0.  /* If this 
b190: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
b1a0: 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64 69 6e   while re-readin
b1b0: 67 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f  g the schema fro
b1c0: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  m sqlite_master.
b1d0: 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74 61 62    ** but the tab
b1e0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
b1f0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  th this index is
b200: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b210: 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20  le, it can.  ** 
b220: 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74 20 74  only mean that t
b230: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  he table that th
b240: 69 73 20 69 6e 64 65 78 20 69 73 20 72 65 61 6c  is index is real
b250: 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ly associated wi
b260: 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 20 77  th is.  ** one w
b270: 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68 69 64  hose name is hid
b280: 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74 65 6d  den behind a tem
b290: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77 69 74  porary table wit
b2a0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
b2b0: 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74 73 20  .  ** Since its 
b2c0: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 73  table has been s
b2d0: 75 70 70 72 65 73 73 65 64 2c 20 77 65 20 6e 65  uppressed, we ne
b2e0: 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70 70 72  ed to also suppr
b2f0: 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  ess the.  ** ind
b300: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
b310: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
b320: 26 26 20 21 70 50 61 72 73 65 2d 3e 69 73 54 65  && !pParse->isTe
b330: 6d 70 20 26 26 20 70 54 61 62 2d 3e 69 44 62 20  mp && pTab->iDb 
b340: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
b350: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
b360: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
b370: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
b380: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
b390: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
b3a0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
b3b0: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
b3c0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
b3d0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
b3e0: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
b3f0: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
b400: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
b410: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
b420: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
b430: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
b440: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
b450: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
b460: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
b470: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
b480: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
b490: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
b4a0: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
b4b0: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
b4c0: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
b4d0: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
b4e0: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
b4f0: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
b500: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
b510: 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
b520: 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
b530: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
b540: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
b550: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
b560: 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
b570: 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
b580: 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
b590: 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21    if( pName && !
b5a0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
b5b0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
b5c0: 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  ISameName;    /*
b5d0: 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77   Another index w
b5e0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
b5f0: 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  e */.    Table *
b600: 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pTSameName;    /
b610: 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73  * A table with s
b620: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
b630: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61  index */.    zNa
b640: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
b650: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
b660: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
b670: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
b680: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
b690: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
b6a0: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
b6b0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
b6c0: 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20  me, 0))!=0 ){.  
b6d0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
b6e0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
b6f0: 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20  rMsg, "index ", 
b700: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
b710: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
b720: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  s", 0);.      pP
b730: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
b740: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b750: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
b760: 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53 61 6d  }.    if( (pTSam
b770: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
b780: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
b790: 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
b7a0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
b7b0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
b7c0: 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61  Msg, "there is a
b7d0: 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
b7e0: 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20  amed ",.        
b7f0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
b800: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
b810: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
b820: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
b830: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
b840: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( pName==0 ){.  
b850: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
b860: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
b870: 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
b880: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
b890: 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
b8a0: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
b8b0: 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
b8c0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
b8d0: 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20  f,"%d)",n);.    
b8e0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
b8f0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
b900: 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62  zName, "(", pTab
b910: 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69  ->zName, " autoi
b920: 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29  ndex ", zBuf, 0)
b930: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
b940: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
b950: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
b960: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
b970: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
b980: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
b990: 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  >n);.  }..  /* C
b9a0: 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
b9b0: 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
b9c0: 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
b9d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b9e0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
b9f0: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
ba00: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
ba10: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
ba20: 70 54 61 62 2d 3e 69 44 62 3d 3d 70 50 61 72 73  pTab->iDb==pPars
ba30: 65 2d 3e 69 44 62 20 7c 7c 20 69 73 54 65 6d 70  e->iDb || isTemp
ba40: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
ba50: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
ba60: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
ba70: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
ba80: 28 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a  (isTemp), 0) ){.
ba90: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
baa0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
bab0: 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
bac0: 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28  ATE_INDEX;.  if(
bad0: 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51   isTemp ) i = SQ
bae0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
baf0: 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28 20 73 71  _INDEX;.  if( sq
bb00: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
bb10: 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
bb20: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  pTab->zName) ){.
bb30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
bb40: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
bb50: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
bb60: 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
bb70: 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
bb80: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
bb90: 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
bba0: 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
bbb0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
bbc0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
bbd0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
bbe0: 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
bbf0: 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
bc00: 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
bc10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
bc20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
bc30: 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
bc40: 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
bc50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
bc60: 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c  d.n = strlen(nul
bc70: 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
bc80: 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  t = sqliteIdList
bc90: 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49  Append(0, &nullI
bca0: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
bcb0: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
bcc0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
bcd0: 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
bce0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
bcf0: 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
bd00: 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
bd10: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
bd20: 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
bd30: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
bd60: 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29  nt)*pList->nId )
bd70: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
bd80: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
bd90: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
bda0: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
bdb0: 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31   (int*)&pIndex[1
bdc0: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
bdd0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
bde0: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
bdf0: 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72  ist->nId];.  str
be00: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
be10: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
be20: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
be30: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
be40: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
be50: 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  Id;.  pIndex->on
be60: 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
be70: 69 73 55 6e 69 71 75 65 20 3d 20 6f 6e 45 72 72  isUnique = onErr
be80: 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
be90: 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
bea0: 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44  =0;.  pIndex->iD
beb0: 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20 3a  b = isTemp ? 1 :
bec0: 20 70 50 61 72 73 65 2d 3e 69 44 62 3b 0a 0a 20   pParse->iDb;.. 
bed0: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
bee0: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
bef0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
bf00: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
bf10: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
bf20: 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
bf30: 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
bf40: 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
bf50: 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
bf60: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
bf70: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
bf80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
bf90: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
bfa0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
bfb0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
bfc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
bfd0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
bfe0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
bff0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
c000: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
c010: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
c020: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
c030: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
c040: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
c050: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
c060: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
c070: 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d    " has no colum
c080: 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74  n named ", pList
c090: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29  ->a[i].zName, 0)
c0a0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
c0b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nErr++;.      sq
c0c0: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
c0d0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
c0e0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c0f0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
c100: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
c110: 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  j;.  }..  /* Lin
c120: 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
c130: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
c140: 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
c150: 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
c160: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
c170: 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
c180: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
c190: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
c1a0: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
c1b0: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
c1c0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 73 54 65  rt(&db->aDb[isTe
c1d0: 6d 70 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  mp].idxHash, .  
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
c200: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
c210: 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a  me)+1, pIndex);.
c220: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
c230: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
c240: 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
c250: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
c260: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  led */.      sql
c270: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
c280: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c290: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
c2a0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
c2b0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
c2c0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
c2d0: 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
c2e0: 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
c2f0: 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
c300: 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
c310: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
c320: 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
c330: 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
c340: 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
c350: 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
c360: 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
c370: 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
c380: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
c390: 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
c3a0: 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
c3b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45  ..  */.  if( onE
c3c0: 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
c3d0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
c3e0: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54  ==0.       || pT
c3f0: 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
c400: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
c410: 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e  {.    pIndex->pN
c420: 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
c430: 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49  ex;.    pTab->pI
c440: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
c450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
c460: 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
c470: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68  ->pIndex;.    wh
c480: 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
c490: 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
c4a0: 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
c4b0: 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
c4c0: 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
c4d0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
c4e0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
c4f0: 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
c500: 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  t;.    pOther->p
c510: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
c520: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
c530: 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74  initFlag is 1 it
c540: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
c550: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
c560: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
c570: 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  te_master" table
c580: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53   on the disk.  S
c590: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
c5a0: 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20  o the disk.  ** 
c5b0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
c5c0: 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  the table number
c5d0: 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65   from the pParse
c5e0: 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  ->newTnum field.
c5f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
c600: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20  se->initFlag && 
c610: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
c620: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
c630: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b  pParse->newTnum;
c640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
c650: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20  e initFlag is 0 
c660: 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
c670: 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
c680: 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
c690: 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
c6a0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
c6b0: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
c6c0: 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
c6d0: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
c6e0: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
c6f0: 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
c700: 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61 67   ** The initFlag
c710: 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
c720: 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
c730: 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
c740: 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
c750: 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  The initFlag is 
c760: 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
c770: 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
c780: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
c790: 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
c7a0: 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
c7b0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
c7c0: 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
c7d0: 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
c7e0: 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
c7f0: 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
c800: 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
c810: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
c820: 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
c830: 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d    ** If pTable==
c840: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
c850: 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
c860: 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
c870: 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
c880: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
c890: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c8a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
c8b0: 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
c8c0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
c8d0: 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
c8e0: 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
c8f0: 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
c900: 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
c910: 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
c920: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
c930: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
c940: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  lag==0 ){.    in
c950: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
c960: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
c970: 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  lbl2;.    int i;
c980: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  .    int addr;..
c990: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
c9a0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c9b0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
c9c0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c9d0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
c9e0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
c9f0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
ca00: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ca10: 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  e, 0, isTemp);. 
ca20: 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d       sqliteOpenM
ca30: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73  asterTable(v, is
ca40: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Temp);.    }.   
ca50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ca60: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
ca70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
ca80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ca90: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
caa0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
cab0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
cac0: 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
cad0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  C);.    sqliteVd
cae0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
caf0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
cb00: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
cb10: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65  eP3(v, -1, pInde
cb20: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
cb30: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
cb40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb50: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
cb60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
cb70: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
cb80: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
cb90: 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  TIC);.    addr =
cba0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
cbb0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
cbc0: 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  ex, 0, isTemp);.
cbd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
cbe0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
cbf0: 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
cc00: 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52  tnum, P3_POINTER
cc10: 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  );.    pIndex->t
cc20: 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  num = 0;.    if(
cc30: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
cc40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
cc50: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
cc60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
cc70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cc80: 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c 20  nteger, isTemp, 
cc90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
cca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ccb0: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29  OpenWrite, 1, 0)
ccc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
ccd0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
cce0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
ccf0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
cd00: 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
cd10: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  {.      n = Addr
cd20: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
cd30: 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31 3b  (pStart->z) + 1;
cd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
cd50: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
cd60: 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29  r, pStart->z, n)
cd70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
cd80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cd90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
cda0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
cdb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
cdc0: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
cdd0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
cde0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
cdf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ce00: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44  nteger, pTab->iD
ce10: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
ce20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ce30: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20  OP_OpenRead, 2, 
ce40: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
ce50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
ce60: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
ce70: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
ce80: 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  TIC);.      lbl2
ce90: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
cea0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
ceb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
cec0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
ced0: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
cee0: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
cef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
cf00: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
cf10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
cf20: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
cf30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
cf40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cf50: 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65  Column, 2, pInde
cf60: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  x->aiColumn[i]);
cf70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
cf80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cf90: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
cfa0: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
cfb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
cfc0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
cfd0: 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 49 64  =4 ) sqliteAddId
cfe0: 78 4b 65 79 54 79 70 65 28 76 2c 20 70 49 6e 64  xKeyType(v, pInd
cff0: 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
d000: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d010: 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
d020: 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
d030: 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  None);.      sql
d040: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d050: 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 65 64 20  v, -1, "indexed 
d060: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
d070: 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54  unique", P3_STAT
d080: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
d090: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d0a0: 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b  _Next, 2, lbl1);
d0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d0c0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d0d0: 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71   lbl2);.      sq
d0e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d0f0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29   OP_Close, 2, 0)
d100: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
d120: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
d130: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  }.    if( pTable
d140: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
d150: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
d160: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
d170: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
d180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d190: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d1a0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
d1b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64  .      sqliteEnd
d1c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d1d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
d1e0: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
d1f0: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
d200: 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
d210: 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49 64  ndex:.  sqliteId
d220: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
d230: 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69  );.  sqliteSrcLi
d240: 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 29  stDelete(pTable)
d250: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
d260: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
d270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d280: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
d290: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
d2a0: 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
d2b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
d2c0: 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
d2d0: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
d2e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72  */.void sqliteDr
d2f0: 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
d300: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
d310: 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  pName){.  Index 
d320: 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
d330: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *v;.  sqlite *db
d340: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
d350: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
d360: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
d370: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
d380: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
d390: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
d3a0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
d3b0: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
d3c0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
d3d0: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
d3e0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
d3f0: 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
d400: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
d410: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
d420: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  sg, "no such ind
d430: 65 78 3a 20 22 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex: ", pName->a[
d440: 30 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  0].zName, 0);.  
d450: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
d460: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
d470: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
d480: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
d490: 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
d4a0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
d4b0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
d4c0: 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
d4d0: 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
d4e0: 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
d4f0: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
d500: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
d510: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ped", 0);.    pP
d520: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
d530: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
d540: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
d550: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20  ( pIndex->iDb>1 
d560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
d570: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
d580: 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74  zErrMsg, "cannot
d590: 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66   alter schema of
d5a0: 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20 20   attached ".    
d5b0: 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c 20     "databases", 
d5c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
d5d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
d5e0: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
d5f0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
d600: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
d610: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
d620: 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
d630: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
d640: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
d650: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
d660: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
d670: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
d680: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53  SQLITE_DELETE, S
d690: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64  CHEMA_TABLE(pInd
d6a0: 65 78 2d 3e 69 44 62 29 2c 20 30 29 20 29 7b 0a  ex->iDb), 0) ){.
d6b0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
d6c0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
d6d0: 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  }.    if( pIndex
d6e0: 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  ->iDb ) code = S
d6f0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
d700: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
d710: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
d720: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
d730: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
d740: 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
d750: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
d760: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
d770: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
d780: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d790: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
d7a0: 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
d7b0: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
d7c0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
d7d0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
d7e0: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
d7f0: 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65   VdbeOp dropInde
d800: 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  x[] = {.      { 
d810: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
d820: 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a  , ADDR(9), 0}, .
d830: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
d840: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
d850: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
d860: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
d870: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
d880: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
d890: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
d8a0: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
d8b0: 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
d8c0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31  Column,     0, 1
d8d0: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
d8e0: 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20    { OP_Eq,      
d8f0: 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30     0, ADDR(8), 0
d900: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
d910: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
d920: 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(3), 0},.      
d930: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
d940: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
d950: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
d960: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
d970: 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a      0}, /* 8 */.
d980: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62      };.    int b
d990: 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ase;..    sqlite
d9a0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d9b0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
d9c0: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
d9d0: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
d9e0: 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78  rTable(v, pIndex
d9f0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65  ->iDb);.    base
da00: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
da10: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
da20: 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20  ize(dropIndex), 
da30: 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  dropIndex);.    
da40: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
da50: 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49  P3(v, base+1, pI
da60: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
da70: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
da80: 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >iDb==0 ){.     
da90: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
daa0: 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20  kie(db, v);.    
dab0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
dac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
dad0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
dae0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
daf0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e   OP_Destroy, pIn
db00: 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65  dex->tnum, pInde
db10: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
db20: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
db30: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
db40: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
db50: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73  he in-memory des
db60: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73  cription of this
db70: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
db80: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
db90: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
dba0: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
dbb0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
dbc0: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
dbd0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
dbe0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65  nChanges;.  }..e
dbf0: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
dc00: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44    sqliteSrcListD
dc10: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
dc20: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
dc30: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
dc40: 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
dc50: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
dc60: 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
dc70: 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
dc80: 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
dc90: 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
dca0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
dcb0: 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
dcc0: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64  eIdListAppend(Id
dcd0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
dce0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
dcf0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
dd00: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
dd10: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
dd20: 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
dd30: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
dd40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
dd50: 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20  ( (pList->nId & 
dd60: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  7)==0 ){.    str
dd70: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
dd80: 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69  *a;.    a = sqli
dd90: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
dda0: 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b  >a, (pList->nId+
ddb0: 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  8)*sizeof(pList-
ddc0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
ddd0: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
dde0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
ddf0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
de00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
de10: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
de20: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
de30: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
de40: 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
de50: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
de60: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
de70: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
de80: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
de90: 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
dea0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
deb0: 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  g(pz, pToken->z,
dec0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a   pToken->n, 0);.
ded0: 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29      if( *pz==0 )
dee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64  {.      sqliteId
def0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
df00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
df10: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
df20: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
df30: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
df40: 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  }.  pList->nId++
df50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
df60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
df70: 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
df80: 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
df90: 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
dfa0: 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
dfb0: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
dfc0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
dfd0: 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
dfe0: 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
dff0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
e000: 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
e010: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
e020: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
e030: 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
e040: 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
e050: 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
e060: 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
e070: 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
e080: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
e090: 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
e0a0: 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
e0b0: 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
e0c0: 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
e0d0: 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
e0e0: 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
e0f0: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
e100: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
e110: 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
e120: 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
e130: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
e140: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
e150: 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
e160: 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
e170: 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
e180: 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
e190: 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
e1a0: 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
e1b0: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
e1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
e1d0: 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
e1e0: 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
e1f0: 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
e200: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
e210: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
e220: 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
e230: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
e240: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
e250: 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
e260: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
e270: 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
e280: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
e290: 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
e2a0: 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
e2b0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
e2c0: 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
e2d0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
e2e0: 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
e2f0: 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
e300: 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
e310: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
e320: 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
e330: 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64  iteSrcListAppend
e340: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
e350: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
e360: 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
e370: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
e380: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
e390: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
e3a0: 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
e3b0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
e3c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
e3d0: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
e3e0: 3e 6e 53 72 63 20 26 20 37 29 3d 3d 31 20 29 7b  >nSrc & 7)==1 ){
e3f0: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
e400: 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  ew;.    pNew = s
e410: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
e420: 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
e430: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
e440: 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63  ) + (pList->nSrc
e450: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  +8)*sizeof(pList
e460: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
e470: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
e480: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
e490: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
e4a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e4b0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
e4c0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65  = pNew;.  }.  me
e4d0: 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
e4e0: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20  List->nSrc], 0, 
e4f0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
e500: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
e510: 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
e520: 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
e530: 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
e540: 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
e550: 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
e560: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
e570: 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
e580: 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
e590: 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
e5a0: 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
e5b0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
e5c0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
e5d0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
e5e0: 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Src].zName;.    
e5f0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
e600: 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20  (pz, pTable->z, 
e610: 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20  pTable->n, 0);. 
e620: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
e630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
e640: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
e650: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e660: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
e670: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
e680: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
e690: 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
e6a0: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  e ){.    char **
e6b0: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
e6c0: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74  List->nSrc].zDat
e6d0: 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69 74  abase;.    sqlit
e6e0: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
e6f0: 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44  pDatabase->z, pD
e700: 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a  atabase->n, 0);.
e710: 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29      if( *pz==0 )
e720: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72  {.      sqliteSr
e730: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
e740: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
e750: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e760: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
e770: 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
e780: 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63   }.  pList->nSrc
e790: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
e7a0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  st;.}../*.** Add
e7b0: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
e7c0: 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72   last identifier
e7d0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64   on the given id
e7e0: 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a  entifier list..*
e7f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63  /.void sqliteSrc
e800: 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
e810: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
e820: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
e830: 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
e840: 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
e850: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
e860: 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71  nSrc - 1;.    sq
e870: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
e880: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
e890: 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  as, pToken->z, p
e8a0: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
e8b0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
e8c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
e8d0: 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  as);.  }.}../*.*
e8e0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
e8f0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
e900: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49  teIdListDelete(I
e910: 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
e920: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
e930: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
e940: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
e950: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
e960: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e970: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
e980: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
e990: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
e9a0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
e9b0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
e9c0: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
e9d0: 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
e9e0: 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
e9f0: 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
ea00: 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
ea10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64 4c  */.int sqliteIdL
ea20: 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
ea30: 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
ea40: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
ea50: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
ea60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
ea70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
ea80: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
ea90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
eaa0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
eab0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
eac0: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
ead0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
eae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
eaf0: 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
eb00: 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
eb10: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
eb20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
eb30: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72  SrcListDelete(Sr
eb40: 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
eb50: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
eb60: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
eb70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
eb80: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
eb90: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
eba0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74  pList->a[i].zDat
ebb0: 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
ebc0: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
ebd0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
ebe0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
ebf0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  >a[i].zAlias);. 
ec00: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
ec10: 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74  i].pTab && pList
ec20: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54  ->a[i].pTab->isT
ec30: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
ec40: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
ec50: 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b  ble(0, pList->a[
ec60: 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  i].pTab);.    }.
ec70: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
ec80: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
ec90: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
eca0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
ecb0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f  e(pList->a[i].pO
ecc0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49 64  n);.    sqliteId
ecd0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ece0: 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a  ->a[i].pUsing);.
ecf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
ed00: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
ed10: 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61  * The COPY comma
ed20: 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70 61 74  nd is for compat
ed30: 69 62 69 6c 69 74 79 20 77 69 74 68 20 50 6f 73  ibility with Pos
ed40: 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70 65 63  tgreSQL and spec
ed50: 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72  ificially.** for
ed60: 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
ed70: 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74 20  read the output 
ed80: 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54 68 65  of pg_dump.  The
ed90: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a   format is as.**
eda0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
edb0: 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20 46 52     COPY table FR
edc0: 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47 20 44  OM file [USING D
edd0: 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69 6e 67  ELIMITERS string
ede0: 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20  ].**.** "table" 
edf0: 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  is an existing t
ee00: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20 77  able name.  We w
ee10: 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73 20 6f  ill read lines o
ee20: 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66  f code from.** f
ee30: 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68 69 73  ile to fill this
ee40: 20 74 61 62 6c 65 20 77 69 74 68 20 64 61 74 61   table with data
ee50: 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20 62 65  .  File might be
ee60: 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65 20 6f   "stdin".  The o
ee70: 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d  ptional.** delim
ee80: 69 74 65 72 20 73 74 72 69 6e 67 20 69 64 65 6e  iter string iden
ee90: 74 69 66 69 65 73 20 74 68 65 20 66 69 65 6c 64  tifies the field
eea0: 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 54 68   separators.  Th
eeb0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 61 20 74  e default is a t
eec0: 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ab..*/.void sqli
eed0: 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20  teCopy(.  Parse 
eee0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
eef0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
ef00: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
ef10: 74 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 2f  t *pTableName, /
ef20: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
ef30: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
ef40: 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72  ch we will inser
ef50: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46  t */.  Token *pF
ef60: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54  ilename,    /* T
ef70: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
ef80: 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66  ch to obtain inf
ef90: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  ormation */.  To
efa0: 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72 2c  ken *pDelimiter,
efb0: 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 61     /* Use this a
efc0: 73 20 74 68 65 20 66 69 65 6c 64 20 64 65 6c 69  s the field deli
efd0: 6d 69 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  miter */.  int o
efe0: 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20  nError          
eff0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 69 66  /* What to do if
f000: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61   a constraint fa
f010: 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ils */.){.  Tabl
f020: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
f030: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
f040: 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20  nt addr, end;.  
f050: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
f060: 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a  har *zFile = 0;.
f070: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
f080: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 0a 20 20 69  Parse->db;...  i
f090: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
f0a0: 5f 66 61 69 6c 65 64 20 20 29 20 67 6f 74 6f 20  _failed  ) goto 
f0b0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
f0c0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 4e 61  assert( pTableNa
f0d0: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
f0e0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61   pTab = sqliteTa
f0f0: 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70  bleNameToTable(p
f100: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d  Parse, pTableNam
f110: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 0a 20  e->a[0].zName,. 
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f140: 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  TableName->a[0].
f150: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
f160: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
f170: 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20   copy_cleanup;. 
f180: 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 53   zFile = sqliteS
f190: 74 72 4e 44 75 70 28 70 46 69 6c 65 6e 61 6d 65  trNDup(pFilename
f1a0: 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ->z, pFilename->
f1b0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  n);.  sqliteDequ
f1c0: 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20 20 69 66  ote(zFile);.  if
f1d0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
f1e0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
f1f0: 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 2d 3e 7a  _INSERT, pTab->z
f200: 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 0a 20 20 20  Name, zFile).   
f210: 20 20 20 7c 7c 20 73 71 6c 69 74 65 41 75 74 68     || sqliteAuth
f220: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
f230: 4c 49 54 45 5f 43 4f 50 59 2c 20 70 54 61 62 2d  LITE_COPY, pTab-
f240: 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 20 29  >zName, zFile) )
f250: 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f  {.    goto copy_
f260: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76  cleanup;.  }.  v
f270: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f280: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f290: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42  v ){.    sqliteB
f2a0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
f2b0: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 70 54  on(pParse, 1, pT
f2c0: 61 62 2d 3e 69 44 62 3d 3d 31 29 3b 0a 20 20 20  ab->iDb==1);.   
f2d0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
f2e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
f2f0: 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  leOpen, 0, 0);. 
f300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
f310: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
f320: 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69  Filename->z, pFi
f330: 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20  lename->n);.    
f340: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
f350: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
f360: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f370: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
f380: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
f390: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f3a0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
f3b0: 69 74 65 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e  ite, 0, pTab->tn
f3c0: 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  um);.    sqliteV
f3d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
f3e0: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
f3f0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
f400: 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54  for(i=1, pIdx=pT
f410: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
f420: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
f430: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
f440: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44  assert( pIdx->iD
f450: 62 3d 3d 31 20 7c 7c 20 70 49 64 78 2d 3e 69 44  b==1 || pIdx->iD
f460: 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
f470: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f490: 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20  ger, pIdx->iDb, 
f4a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f4b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f4c0: 4f 70 65 6e 57 72 69 74 65 2c 20 69 2c 20 70 49  OpenWrite, i, pI
f4d0: 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20  dx->tnum);.     
f4e0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
f4f0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d  eP3(v, -1, pIdx-
f500: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
f510: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  C);.    }.    if
f520: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
f530: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
f540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
f550: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f560: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20 2f  teger, 0, 0);  /
f570: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f580: 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   row count */.  
f590: 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71    }.    end = sq
f5a0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
f5b0: 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  l(v);.    addr =
f5c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f5d0: 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c  (v, OP_FileRead,
f5e0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64   pTab->nCol, end
f5f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c 69  );.    if( pDeli
f600: 6d 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  miter ){.      s
f610: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
f620: 33 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c 69  3(v, addr, pDeli
f630: 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d  miter->z, pDelim
f640: 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  iter->n);.      
f650: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
f660: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
f670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f680: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
f690: 33 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c  3(v, addr, "\t",
f6a0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
f6b0: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
f6c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f6d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f6e0: 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54 61  _FileColumn, pTa
f6f0: 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20 20  b->iPKey, 0);.  
f700: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f710: 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  dOp(v, OP_MustBe
f720: 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Int, 0, 0);.    
f730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f740: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f750: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
f760: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
f770: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
f780: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f790: 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50   if( i==pTab->iP
f7a0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Key ){.        /
f7b0: 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 70 72  * The integer pr
f7c0: 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e  imary key column
f7d0: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
f7e0: 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a 20  NULL since its. 
f7f0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
f800: 69 73 20 61 6c 77 61 79 73 20 70 75 6c 6c 65 64  is always pulled
f810: 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
f820: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
f830: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f840: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
f850: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
f860: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
f870: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f880: 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69  OP_FileColumn, i
f890: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f8a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 47 65    }.    sqliteGe
f8b0: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
f8c0: 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70  Checks(pParse, p
f8d0: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  Tab, 0, 0, 0, 0,
f8e0: 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b   onError, addr);
f8f0: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c  .    sqliteCompl
f900: 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61  eteInsertion(pPa
f910: 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c  rse, pTab, 0, 0,
f920: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
f930: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
f940: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d  ITE_CountRows)!=
f950: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f960: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f970: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 20  _AddImm, 1, 0); 
f980: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f   /* Increment ro
f990: 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d  w count */.    }
f9a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
f9c0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73   0, addr);.    s
f9d0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
f9e0: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20  Label(v, end);. 
f9f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
fa00: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
fa10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fa20: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
fa30: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  n(pParse);.    i
fa40: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
fa50: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
fa60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
fa70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
fa80: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29  olumnName, 0, 0)
fa90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
faa0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
fab0: 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64  , "rows inserted
fac0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
fad0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
fae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
faf0: 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ack, 1, 0);.    
fb00: 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c  }.  }.  .copy_cl
fb10: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 53  eanup:.  sqliteS
fb20: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  rcListDelete(pTa
fb30: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  bleName);.  sqli
fb40: 74 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  teFree(zFile);. 
fb50: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
fb60: 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61  * The non-standa
fb70: 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  rd VACUUM comman
fb80: 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65  d is used to cle
fb90: 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61  an up the databa
fba0: 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20  se,.** collapse 
fbb0: 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e  free space, etc.
fbc0: 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64    It is modelled
fbd0: 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55   after the VACUU
fbe0: 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20  M command.** in 
fbf0: 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a  PostgreSQL..**.*
fc00: 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  * In version 1.0
fc10: 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68  .x of SQLite, th
fc20: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
fc30: 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67   would call.** g
fc40: 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29  dbm_reorganize()
fc50: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61   on all the data
fc60: 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75  base tables.  Bu
fc70: 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77  t beginning.** w
fc80: 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74  ith 2.0.0, SQLit
fc90: 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
fca0: 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f   GDBM so this co
fcb0: 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63  mmand has.** bec
fcc0: 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  ome a no-op..*/.
fcd0: 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75  void sqliteVacuu
fce0: 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  m(Parse *pParse,
fcf0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
fd00: 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  me){.  /* Do not
fd10: 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
fd20: 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
fd30: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
fd40: 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  iteBeginTransact
fd50: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
fd60: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
fd70: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
fd80: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
fd90: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
fda0: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
fdb0: 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
fdc0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
fdd0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
fde0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
fdf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
fe00: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
fe10: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
fe20: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
fe30: 49 4e 22 2c 20 30 29 20 29 20 72 65 74 75 72 6e  IN", 0) ) return
fe40: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
fe50: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
fe60: 6e 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ns ){.    pParse
fe70: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71  ->nErr++;.    sq
fe80: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
fe90: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
fea0: 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  "cannot start a 
feb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 0a 20 20  transaction ".  
fec0: 20 20 20 20 20 22 77 69 74 68 69 6e 20 61 20 74       "within a t
fed0: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 30 29 3b  ransaction", 0);
fee0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fef0: 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  .  sqliteBeginWr
ff00: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ff10: 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62  rse, 0, 0);.  db
ff20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ff30: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d  E_InTrans;.  db-
ff40: 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
ff50: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  or;.}../*.** Com
ff60: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
ff70: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
ff80: 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
ff90: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
ffa0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
ffb0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
ffc0: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
ffd0: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
ffe0: 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
fff0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
10000 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
10010 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
10020 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10030 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
10040 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
10050 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f  TRANSACTION, "CO
10060 4d 4d 49 54 22 2c 20 30 29 20 29 20 72 65 74 75  MMIT", 0) ) retu
10070 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
10080 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
10090 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
100a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
100b0 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
100c0 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
100d0 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 22  rrMsg, .       "
100e0 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20  cannot commit - 
100f0 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
10100 73 20 61 63 74 69 76 65 22 2c 20 30 29 3b 0a 20  s active", 0);. 
10110 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10120 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
10130 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
10140 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
10150 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
10160 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
10170 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
10180 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
10190 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
101a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c  .void sqliteRoll
101b0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
101c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
101d0 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
101e0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
101f0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
10200 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
10210 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
10220 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
10230 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10240 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
10250 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
10260 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
10270 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10280 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
10290 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
102a0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  , 0) ) return;. 
102b0 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
102c0 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
102d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  )==0 ){.    pPar
102e0 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
102f0 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
10300 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
10310 2c 0a 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74  ,.       "cannot
10320 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74   rollback - no t
10330 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
10340 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
10350 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20  eturn; .  }.  v 
10360 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
10370 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
10380 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
10390 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
103a0 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20  llback, 0, 0);. 
103b0 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26   }.  db->flags &
103c0 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
103d0 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  s;.  db->onError
103e0 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d   = OE_Default;.}
103f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10400 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
10410 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
10420 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f  schema cookie fo
10430 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64  r all.** named d
10440 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
10450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 64  /.void sqliteCod
10460 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
10470 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10480 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 20  int i;.  sqlite 
10490 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
104a0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
104b0 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
104c0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  se);.  for(i=0; 
104d0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
104e0 0a 20 20 20 20 69 66 28 20 69 3d 3d 31 20 7c 7c  .    if( i==1 ||
104f0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
10500 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10510 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10520 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
10530 6f 6f 6b 69 65 2c 20 30 2c 20 64 62 2d 3e 61 44  ookie, 0, db->aD
10540 62 5b 69 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  b[i].schema_cook
10550 69 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ie);.  }.  pPars
10560 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
10570 64 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = 1;.}../*.** 
10580 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
10590 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
105a0 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
105b0 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
105c0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
105d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
105e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
105f0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
10600 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
10610 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
10620 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
10630 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
10640 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
10650 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
10660 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
10670 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
10680 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  e setCheckpoint 
10690 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
106a0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
106b0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
106c0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
106d0 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
106e0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
106f0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
10700 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
10710 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
10720 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
10730 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
10740 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
10750 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
10760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
10770 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
10780 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
10790 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
107a0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
107b0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
107c0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
107d0 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
107e0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
107f0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
10800 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
10810 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
10820 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 6d  t..**.** The tem
10830 70 4f 6e 6c 79 20 66 6c 61 67 20 69 6e 64 69 63  pOnly flag indic
10840 61 74 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 74  ates that only t
10850 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
10860 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 0a  will be changed.
10870 2a 2a 20 64 75 72 69 6e 67 20 74 68 69 73 20 77  ** during this w
10880 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  rite operation. 
10890 20 54 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   The primary dat
108a0 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6e  abase table is n
108b0 6f 74 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  ot.** write-lock
108c0 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 20 74 65  ed.  Only the te
108d0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
108e0 20 66 69 6c 65 20 67 65 74 73 20 61 20 77 72 69   file gets a wri
108f0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74 68 65  te lock..** Othe
10900 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
10910 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 61 64  continue to read
10920 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 70 72   or write the pr
10930 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 20 66  imary database f
10940 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
10950 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
10960 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
10970 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65  arse, int setChe
10980 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 74 65 6d  ckpoint, int tem
10990 70 4f 6e 6c 79 29 7b 0a 20 20 56 64 62 65 20 2a  pOnly){.  Vdbe *
109a0 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  v;.  v = sqliteG
109b0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
109c0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
109d0 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
109e0 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72  e->trigStack ) r
109f0 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69  eturn; /* if thi
10a00 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65  s is in a trigge
10a10 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72  r */.  if( (pPar
10a20 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
10a30 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
10a40 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
10a50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a60 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31 2c 20  Transaction, 1, 
10a70 30 29 3b 0a 20 20 20 20 69 66 28 20 21 74 65 6d  0);.    if( !tem
10a80 70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  pOnly ){.      s
10a90 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10aa0 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
10ab0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
10ac0 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79 53  qliteCodeVerifyS
10ad0 63 68 65 6d 61 28 70 50 61 72 73 65 29 3b 0a 20  chema(pParse);. 
10ae0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
10af0 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29   setCheckpoint )
10b00 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
10b10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63  AddOp(v, OP_Chec
10b20 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  kpoint, 0, 0);. 
10b30 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10b40 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f  Op(v, OP_Checkpo
10b50 69 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  int, 1, 0);.  }.
10b60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10b70 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
10b80 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
10b90 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
10ba0 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
10bb0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
10bc0 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66  is a companion f
10bd0 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e  unction to Begin
10be0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29  WriteOperation()
10bf0 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  ..** If a transa
10c00 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
10c10 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69  d, then commit i
10c20 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70 6f  t.  If a checkpo
10c30 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72 74  int was.** start
10c40 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  ed then commit t
10c50 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  hat..*/.void sql
10c60 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
10c70 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
10c80 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
10c90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72    if( pParse->tr
10ca0 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e  igStack ) return
10cb0 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20  ; /* if this is 
10cc0 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a  in a trigger */.
10cd0 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
10ce0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10cf0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10d00 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10d10 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10d20 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
10d30 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20    /* Do Nothing 
10d40 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
10d50 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10d60 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c  v, OP_Commit, 0,
10d70 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   0);.  }.}.../*.
10d80 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
10d90 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
10da0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
10db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10dc0 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20  getBoolean(char 
10dd0 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *z){.  static ch
10de0 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b  ar *azTrue[] = {
10df0 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74   "yes", "on", "t
10e00 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  rue" };.  int i;
10e10 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29  .  if( z[0]==0 )
10e20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10e30 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c   isdigit(z[0]) |
10e40 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  | (z[0]=='-' && 
10e50 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29  isdigit(z[1])) )
10e60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f  {.    return ato
10e70 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  i(z);.  }.  for(
10e80 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
10e90 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54  True)/sizeof(azT
10ea0 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  rue[0]); i++){. 
10eb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
10ec0 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d  ICmp(z,azTrue[i]
10ed0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
10ee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
10ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  .}../*.** Interp
10f00 72 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  ret the given st
10f10 72 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79  ring as a safety
10f20 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
10f30 30 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20  0 for OFF,.** 1 
10f40 66 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c  for ON or NORMAL
10f50 20 61 6e 64 20 32 20 66 6f 72 20 46 55 4c 4c 2e   and 2 for FULL.
10f60 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
10f70 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75   the values retu
10f80 72 6e 65 64 20 61 72 65 20 6f 6e 65 20 6c 65 73  rned are one les
10f90 73 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  s that the value
10fa0 73 20 74 68 61 74 0a 2a 2a 20 73 68 6f 75 6c 64  s that.** should
10fb0 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 20   be passed into 
10fc0 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 53 61  sqliteBtreeSetSa
10fd0 66 65 74 79 4c 65 76 65 6c 28 29 2e 20 20 54 68  fetyLevel().  Th
10fe0 65 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20  e is done.** to 
10ff0 73 75 70 70 6f 72 74 20 6c 65 67 61 63 79 20 53  support legacy S
11000 51 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 73 61  QL code.  The sa
11010 66 65 74 79 20 6c 65 76 65 6c 20 75 73 65 64 20  fety level used 
11020 74 6f 20 62 65 20 62 6f 6f 6c 65 61 6e 0a 2a 2a  to be boolean.**
11030 20 61 6e 64 20 6f 6c 64 65 72 20 73 63 72 69 70   and older scrip
11040 74 73 20 6d 61 79 20 68 61 76 65 20 75 73 65 64  ts may have used
11050 20 6e 75 6d 62 65 72 73 20 30 20 66 6f 72 20 4f   numbers 0 for O
11060 46 46 20 61 6e 64 20 31 20 66 6f 72 20 4f 4e 2e  FF and 1 for ON.
11070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
11080 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 63 68  etSafetyLevel(ch
11090 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63  ar *z){.  static
110a0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
110b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
110c0 7a 57 6f 72 64 3b 0a 20 20 20 20 69 6e 74 20 76  zWord;.    int v
110d0 61 6c 3b 0a 20 20 7d 20 61 4b 65 79 5b 5d 20 3d  al;.  } aKey[] =
110e0 20 7b 0a 20 20 20 20 7b 20 22 6e 6f 22 2c 20 20   {.    { "no",  
110f0 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 66    0 },.    { "of
11100 66 22 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b  f",   0 },.    {
11110 20 22 66 61 6c 73 65 22 2c 20 30 20 7d 2c 0a 20   "false", 0 },. 
11120 20 20 20 7b 20 22 79 65 73 22 2c 20 20 20 31 20     { "yes",   1 
11130 7d 2c 0a 20 20 20 20 7b 20 22 6f 6e 22 2c 20 20  },.    { "on",  
11140 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72    1 },.    { "tr
11150 75 65 22 2c 20 20 31 20 7d 2c 0a 20 20 20 20 7b  ue",  1 },.    {
11160 20 22 66 75 6c 6c 22 2c 20 20 32 20 7d 2c 0a 20   "full",  2 },. 
11170 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   };.  int i;.  i
11180 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74  f( z[0]==0 ) ret
11190 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 73 64  urn 1;.  if( isd
111a0 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a  igit(z[0]) || (z
111b0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69  [0]=='-' && isdi
111c0 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20  git(z[1])) ){.  
111d0 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29    return atoi(z)
111e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
111f0 20 69 3c 73 69 7a 65 6f 66 28 61 4b 65 79 29 2f   i<sizeof(aKey)/
11200 73 69 7a 65 6f 66 28 61 4b 65 79 5b 30 5d 29 3b  sizeof(aKey[0]);
11210 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
11220 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 61  qliteStrICmp(z,a
11230 4b 65 79 5b 69 5d 2e 7a 57 6f 72 64 29 3d 3d 30  Key[i].zWord)==0
11240 20 29 20 72 65 74 75 72 6e 20 61 4b 65 79 5b 69   ) return aKey[i
11250 5d 2e 76 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  ].val;.  }.  ret
11260 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
11270 50 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61  Process a pragma
11280 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a   statement.  .**
11290 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20  .** Pragmas are 
112a0 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a  of this form:.**
112b0 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20  .**      PRAGMA 
112c0 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a  id = value.**.**
112d0 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
112e0 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
112f0 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
11300 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
11310 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
11320 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
11330 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
11340 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
11350 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
11360 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
11370 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
11380 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  s sign..*/.void 
11390 73 71 6c 69 74 65 50 72 61 67 6d 61 28 50 61 72  sqlitePragma(Par
113a0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
113b0 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
113c0 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e  *pRight, int min
113d0 75 73 46 6c 61 67 29 7b 0a 20 20 63 68 61 72 20  usFlag){.  char 
113e0 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63 68  *zLeft = 0;.  ch
113f0 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a  ar *zRight = 0;.
11400 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
11410 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
11420 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
11430 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11440 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
11450 6e 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71  n;..  zLeft = sq
11460 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66  liteStrNDup(pLef
11470 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b  t->z, pLeft->n);
11480 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
11490 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d  (zLeft);.  if( m
114a0 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
114b0 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  zRight = 0;.    
114c0 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
114d0 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31  (&zRight, "-", 1
114e0 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69  , pRight->z, pRi
114f0 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65  ght->n, 0);.  }e
11500 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20  lse{.    zRight 
11510 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
11520 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68  pRight->z, pRigh
11530 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  t->n);.    sqlit
11540 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29  eDequote(zRight)
11550 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
11560 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
11570 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d  se, SQLITE_PRAGM
11580 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74  A, zLeft, zRight
11590 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
115a0 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20  ree(zLeft);.    
115b0 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68  sqliteFree(zRigh
115c0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
115d0 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20    }. .  /*.  ** 
115e0 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f   PRAGMA default_
115f0 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  cache_size.  ** 
11600 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f   PRAGMA default_
11610 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  cache_size=N.  *
11620 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
11630 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
11640 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73  e current persis
11650 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72  tent setting for
11660 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63   the.  ** page c
11670 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20  ache size.  The 
11680 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
11690 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  s the maximum nu
116a0 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67  mber of.  ** pag
116b0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
116c0 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e  ache.  The secon
116d0 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68  d form sets both
116e0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
116f0 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
11700 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  e value and the 
11710 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20  persistent page 
11720 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
11730 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
11740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11750 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
11760 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73   default cache s
11770 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ize is stored in
11780 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f 66   meta-value 2 of
11790 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a 20   page 1 of the. 
117a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
117b0 65 2e 20 20 54 68 65 20 63 61 63 68 65 20 73 69  e.  The cache si
117c0 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74  ze is actually t
117d0 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
117e0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 6d  e of.  ** this m
117f0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20  emory location. 
11800 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65 74   The sign of met
11810 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72 6d  a-value 2 determ
11820 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 79  ines the.  ** sy
11830 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e  nchronous settin
11840 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 76  g.  A negative v
11850 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68  alue means synch
11860 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20 20  ronous is off.  
11870 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69 76  ** and a positiv
11880 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79  e value means sy
11890 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e  nchronous is on.
118a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
118b0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
118c0 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73  "default_cache_s
118d0 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
118e0 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65  static VdbeOp ge
118f0 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b  tCacheSize[] = {
11900 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64  .      { OP_Read
11910 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20  Cookie,  0, 2,  
11920 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11930 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 20  { OP_AbsValue,  
11940 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
11950 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75  },.      { OP_Du
11960 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c  p,         0, 0,
11970 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
11980 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
11990 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
119a0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
119b0 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20  Ne,          0, 
119c0 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  6,        0},.  
119d0 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
119e0 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53 2c  ,     MAX_PAGES,
119f0 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  0, 0},.      { O
11a00 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
11a10 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63 61 63  , 0,        "cac
11a20 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20  he_size"},.     
11a30 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
11a40 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
11a50 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  0},.    };.    i
11a60 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c  f( pRight->z==pL
11a70 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  eft->z ){.      
11a80 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
11a90 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
11aa0 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20  (getCacheSize), 
11ab0 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20  getCacheSize);. 
11ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ad0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
11ae0 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
11af0 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
11b00 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
11b10 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
11b20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
11b30 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
11b40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
11b50 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11b60 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69  , OP_Integer, si
11b70 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ze, 0);.      sq
11b80 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11b90 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
11ba0 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 2);.      add
11bb0 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
11bc0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
11bd0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
11be0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11bf0 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64  v, OP_Ge, 0, add
11c00 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
11c10 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11c20 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30  P_Negative, 0, 0
11c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
11c40 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
11c50 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b  etCookie, 0, 2);
11c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64  .      sqliteEnd
11c70 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
11c80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62  Parse);.      db
11c90 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64  ->cache_size = d
11ca0 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20  b->cache_size<0 
11cb0 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a  ? -size : size;.
11cc0 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
11cd0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
11ce0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62  ->aDb[0].pBt, db
11cf0 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
11d00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
11d10 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
11d20 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  cache_size.  ** 
11d30 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
11d40 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
11d50 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
11d60 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
11d70 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
11d80 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
11d90 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54  e cache size.  T
11da0 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67  he local setting
11db0 20 63 61 6e 20 62 65 20 64 69 66 66 65 72 65 6e   can be differen
11dc0 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  t from.  ** the 
11dd0 70 65 72 73 69 73 74 65 6e 74 20 63 61 63 68 65  persistent cache
11de0 20 73 69 7a 65 20 76 61 6c 75 65 20 74 68 61 74   size value that
11df0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
11e00 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
11e10 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 20 54 68  file itself.  Th
11e20 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
11e30 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
11e40 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70  number of.  ** p
11e50 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
11e60 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63   cache.  The sec
11e70 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68  ond form sets th
11e80 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67  e local.  ** pag
11e90 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
11ea0 75 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ue.  It does not
11eb0 20 63 68 61 6e 67 65 20 74 68 65 20 70 65 72 73   change the pers
11ec0 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68  istent.  ** cach
11ed0 65 20 73 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e  e size stored on
11ee0 20 74 68 65 20 64 69 73 6b 20 73 6f 20 74 68 65   the disk so the
11ef0 20 63 61 63 68 65 20 73 69 7a 65 20 77 69 6c 6c   cache size will
11f00 20 72 65 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20   revert.  ** to 
11f10 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c 75  its default valu
11f20 65 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  e when the datab
11f30 61 73 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ase is closed an
11f40 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a  d reopened..  **
11f50 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70   N should be a p
11f60 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e  ositive integer.
11f70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
11f80 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
11f90 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30  "cache_size")==0
11fa0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
11fb0 64 62 65 4f 70 20 67 65 74 43 61 63 68 65 53 69  dbeOp getCacheSi
11fc0 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
11fd0 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
11fe0 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
11ff0 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
12000 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
12010 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
12020 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
12030 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d   if( pRight->z==
12040 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
12050 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d    int size = db-
12060 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20 20  >cache_size;;.  
12070 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
12080 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
12090 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
120a0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
120b0 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20  er, size, 0);.  
120c0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
120d0 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
120e0 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
120f0 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65  e), getCacheSize
12100 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12110 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61      int size = a
12120 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
12130 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20     if( size<0 ) 
12140 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
12150 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61 63 68      if( db->cach
12160 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  e_size<0 ) size 
12170 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64  = -size;.      d
12180 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
12190 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
121a0 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53  teBtreeSetCacheS
121b0 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
121c0 42 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  Bt, db->cache_si
121d0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ze);.    }.  }el
121e0 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  se..  /*.  **  P
121f0 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79  RAGMA default_sy
12200 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20  nchronous.  **  
12210 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73  PRAGMA default_s
12220 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 4e 7c 4f 46  ynchronous=ON|OF
12230 46 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20  F|NORMAL|FULL.  
12240 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
12250 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73 20 74  t form returns t
12260 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 76 61  he persistent va
12270 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79 6e 63  lue of the "sync
12280 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e 67  hronous" setting
12290 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 74  .  ** that is st
122a0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
122b0 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 74  base.  This is t
122c0 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  he synchronous s
122d0 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a  etting that.  **
122e0 20 69 73 20 75 73 65 64 20 77 68 65 6e 65 76 65   is used wheneve
122f0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  r the database i
12300 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73 20  s opened unless 
12310 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
12320 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20 22 73  separate.  ** "s
12330 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72 61 67  ynchronous" prag
12340 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ma.  The second 
12350 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
12360 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20   persistent and 
12370 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73  the.  ** local s
12380 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
12390 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ng to the value 
123a0 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  given..  **.  **
123b0 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   If synchronous 
123c0 69 73 20 4f 46 46 2c 20 53 51 4c 69 74 65 20 64  is OFF, SQLite d
123d0 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  oes not attempt 
123e0 61 6e 79 20 66 73 79 6e 63 28 29 20 73 79 73 74  any fsync() syst
123f0 65 6d 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  ems calls.  ** t
12400 6f 20 6d 61 6b 65 20 73 75 72 65 20 64 61 74 61  o make sure data
12410 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f   is committed to
12420 20 64 69 73 6b 2e 20 20 57 72 69 74 65 20 6f 70   disk.  Write op
12430 65 72 61 74 69 6f 6e 73 20 61 72 65 20 76 65 72  erations are ver
12440 79 20 66 61 73 74 2c 0a 20 20 2a 2a 20 62 75 74  y fast,.  ** but
12450 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
12460 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20 64   can leave the d
12470 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20 69 6e  atabase in an in
12480 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
12490 2e 0a 20 20 2a 2a 20 49 66 20 73 79 6e 63 68 72  ..  ** If synchr
124a0 6f 6e 6f 75 73 20 69 73 20 4f 4e 20 6f 72 20 4e  onous is ON or N
124b0 4f 52 4d 41 4c 2c 20 53 51 4c 69 74 65 20 77 69  ORMAL, SQLite wi
124c0 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  ll do an fsync()
124d0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 0a   system call to.
124e0 20 20 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 64    ** make sure d
124f0 61 74 61 20 69 73 20 62 65 69 6e 67 20 77 72 69  ata is being wri
12500 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
12510 68 65 20 72 69 73 6b 20 6f 66 20 63 6f 72 72 75  he risk of corru
12520 70 74 69 6f 6e 20 64 75 65 20 74 6f 0a 20 20 2a  ption due to.  *
12530 2a 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69  * a power loss i
12540 6e 20 74 68 69 73 20 6d 6f 64 65 20 69 73 20 6e  n this mode is n
12550 65 67 6c 69 67 69 62 6c 65 20 62 75 74 20 6e 6f  egligible but no
12560 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 73 79 6e 63  n-zero.  If sync
12570 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20  hronous.  ** is 
12580 46 55 4c 4c 2c 20 65 78 74 72 61 20 66 73 79 6e  FULL, extra fsyn
12590 63 28 29 73 20 6f 63 63 75 72 20 74 6f 20 72 65  c()s occur to re
125a0 64 75 63 65 20 74 68 65 20 72 69 73 6b 20 6f 66  duce the risk of
125b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 74 6f 20 6e   corruption to n
125c0 65 61 72 0a 20 20 2a 2a 20 7a 65 72 6f 2c 20 62  ear.  ** zero, b
125d0 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
125e0 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 65 6e 61  performance pena
125f0 6c 74 79 2e 20 20 54 68 65 20 64 65 66 61 75 6c  lty.  The defaul
12600 74 20 6d 6f 64 65 20 69 73 20 4e 4f 52 4d 41 4c  t mode is NORMAL
12610 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
12620 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
12630 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72  ,"default_synchr
12640 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20  onous")==0 ){.  
12650 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
12660 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20  getSync[] = {.  
12670 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
12680 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
12690 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22     "synchronous"
126a0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
126b0 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 33 2c  adCookie,  0, 3,
126c0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
126d0 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20    { OP_Dup,     
126e0 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
126f0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
12700 49 66 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20  If,          0, 
12710 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 2f  0,        0},  /
12720 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
12730 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30  P_ReadCookie,  0
12740 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
12750 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
12760 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  er,     0, 0,   
12770 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
12780 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20 20   OP_Lt,         
12790 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30 7d   0, 5,        0}
127a0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64  ,.      { OP_Add
127b0 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20  Imm,      1, 0, 
127c0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
127d0 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
127e0 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
127f0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 48  0},.      { OP_H
12800 61 6c 74 2c 20 20 20 20 20 20 20 20 30 2c 20 30  alt,        0, 0
12810 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
12820 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20     { OP_AddImm, 
12830 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 20 20 20      -1, 0,      
12840 20 20 30 7d 2c 20 20 2f 2a 20 31 30 20 2a 2f 0a    0},  /* 10 */.
12850 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
12860 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
12870 20 20 20 20 20 30 7d 0a 20 20 20 20 7d 3b 0a 20       0}.    };. 
12880 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
12890 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
128a0 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
128b0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
128c0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
128d0 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e  getSync), getSyn
128e0 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c);.      sqlite
128f0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
12900 61 64 64 72 2b 33 2c 20 61 64 64 72 2b 31 30 29  addr+3, addr+10)
12910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12920 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
12930 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62     int size = db
12940 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20  ->cache_size;.  
12950 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
12960 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
12970 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
12980 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
12990 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
129a0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
129b0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
129c0 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  okie, 0, 2);.   
129d0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
129e0 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
129f0 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   0);.      addr 
12a00 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
12a10 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
12a20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
12a30 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12a40 20 4f 50 5f 4e 65 2c 20 30 2c 20 61 64 64 72 2b   OP_Ne, 0, addr+
12a50 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
12a60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12a70 41 64 64 49 6d 6d 2c 20 4d 41 58 5f 50 41 47 45  AddImm, MAX_PAGE
12a80 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  S, 0);.      sql
12a90 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12aa0 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20  OP_AbsValue, 0, 
12ab0 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 73 61  0);.      db->sa
12ac0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65 74  fety_level = get
12ad0 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
12ae0 68 74 29 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  ht)+1;.      if(
12af0 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65   db->safety_leve
12b00 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  l==1 ){.        
12b10 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12b20 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20  v, OP_Negative, 
12b30 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
12b40 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
12b50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12b60 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12b70 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32  _SetCookie, 0, 2
12b80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12b90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
12ba0 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73 61 66 65  nteger, db->safe
12bb0 74 79 5f 6c 65 76 65 6c 2c 20 30 29 3b 0a 20 20  ty_level, 0);.  
12bc0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12bd0 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
12be0 6b 69 65 2c 20 30 2c 20 33 29 3b 0a 20 20 20 20  kie, 0, 3);.    
12bf0 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
12c00 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
12c10 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63  );.      db->cac
12c20 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a  he_size = size;.
12c30 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
12c40 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
12c50 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62  ->aDb[0].pBt, db
12c60 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
12c70 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
12c80 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 64  SetSafetyLevel(d
12c90 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64  b->aDb[0].pBt, d
12ca0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  b->safety_level)
12cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
12cc0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
12cd0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  GMA synchronous.
12ce0 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79    **   PRAGMA sy
12cf0 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e  nchronous=OFF|ON
12d00 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a  |NORMAL|FULL.  *
12d10 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
12d20 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
12d30 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63  alue of the sync
12d40 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43  hronous flag.  C
12d50 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
12d60 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
12d70 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
12d80 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
12d90 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  ile and the.  **
12da0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
12db0 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
12dc0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
12dd0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20  e database is.  
12de0 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  ** opened..  */.
12df0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
12e00 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68  Cmp(zLeft,"synch
12e10 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20  ronous")==0 ){. 
12e20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
12e30 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20   getSync[] = {. 
12e40 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
12e50 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
12e60 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
12e70 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
12e80 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
12e90 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
12ea0 20 7d 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67   };.    if( pRig
12eb0 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
12ec0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
12ed0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
12ee0 6e 74 65 67 65 72 2c 20 64 62 2d 3e 73 61 66 65  nteger, db->safe
12ef0 74 79 5f 6c 65 76 65 6c 2d 31 2c 20 30 29 3b 0a  ty_level-1, 0);.
12f00 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12f10 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
12f20 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c  aySize(getSync),
12f30 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d   getSync);.    }
12f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12f50 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65  size = db->cache
12f60 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  _size;.      if(
12f70 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d   size<0 ) size =
12f80 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62   -size;.      db
12f90 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
12fa0 20 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28   getSafetyLevel(
12fb0 7a 52 69 67 68 74 29 2b 31 3b 0a 20 20 20 20 20  zRight)+1;.     
12fc0 20 69 66 28 20 64 62 2d 3e 73 61 66 65 74 79 5f   if( db->safety_
12fd0 6c 65 76 65 6c 3d 3d 31 20 29 20 73 69 7a 65 20  level==1 ) size 
12fe0 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64  = -size;.      d
12ff0 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
13000 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
13010 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53  teBtreeSetCacheS
13020 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
13030 42 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  Bt, db->cache_si
13040 7a 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ze);.      sqlit
13050 65 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  eBtreeSetSafetyL
13060 65 76 65 6c 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  evel(db->aDb[0].
13070 70 42 74 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f  pBt, db->safety_
13080 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
13090 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
130a0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
130b0 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68  , "trigger_overh
130c0 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b  ead_test")==0 ){
130d0 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
130e0 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
130f0 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65       always_code
13100 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
13110 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
13120 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65       always_code
13130 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d  _trigger_setup =
13140 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
13150 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
13160 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76  trICmp(zLeft, "v
13170 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  dbe_trace")==0 )
13180 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
13190 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
131a0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
131b0 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72  |= SQLITE_VdbeTr
131c0 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ace;.    }else{.
131d0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
131e0 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62 65 54  &= ~SQLITE_VdbeT
131f0 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  race;.    }.  }e
13200 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
13210 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
13220 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  "full_column_nam
13230 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  es")==0 ){.    i
13240 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
13250 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
13260 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
13270 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
13280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13290 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
132a0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
132b0 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  mes;.    }.  }el
132c0 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
132d0 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
132e0 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73 22 29  show_datatypes")
132f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
13300 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
13310 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
13320 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52  lags |= SQLITE_R
13330 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20  eportTypes;.    
13340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
13350 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
13360 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20  E_ReportTypes;. 
13370 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
13380 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
13390 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74  p(zLeft, "result
133a0 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d  _set_details")==
133b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
133c0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
133d0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
133e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73  gs |= SQLITE_Res
133f0 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20  ultDetails;.    
13400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
13410 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
13420 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b  E_ResultDetails;
13430 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
13440 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
13450 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e  Cmp(zLeft, "coun
13460 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29  t_changes")==0 )
13470 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
13480 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
13490 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
134a0 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  |= SQLITE_CountR
134b0 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ows;.    }else{.
134c0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
134d0 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74  &= ~SQLITE_Count
134e0 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Rows;.    }.  }e
134f0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
13500 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
13510 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61  "empty_result_ca
13520 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a  llbacks")==0 ){.
13530 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
13540 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
13550 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
13560 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c   SQLITE_NullCall
13570 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  back;.    }else{
13580 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
13590 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c   &= ~SQLITE_Null
135a0 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  Callback;.    }.
135b0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
135c0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
135d0 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22  ft, "table_info"
135e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  )==0 ){.    Tabl
135f0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61  e *pTab;.    pTa
13600 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
13610 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
13620 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  0);.    if( pTab
13630 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
13640 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66   VdbeOp tableInf
13650 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20  oPreface[] = {. 
13660 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
13670 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
13680 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20       "cid"},.   
13690 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
136a0 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20  Name,  1, 0,    
136b0 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20     "name"},.    
136c0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
136d0 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20  ame,  2, 0,     
136e0 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20    "type"},.     
136f0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
13700 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20  me,  3, 0,      
13710 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20   "notnull"},.   
13720 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
13730 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20  Name,  4, 0,    
13740 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d     "dflt_value"}
13750 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
13760 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
13770 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
13780 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74  t(v, ArraySize(t
13790 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
137a0 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  , tableInfoPrefa
137b0 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ce);.      sqlit
137c0 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
137d0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
137e0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
137f0 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
13800 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
13810 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13820 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
13830 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
13840 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13850 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
13860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13870 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
13880 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  1, pTab->aCol[i]
13890 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  .zName, P3_STATI
138a0 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
138b0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
138c0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
138d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
138e0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
138f0 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  1, .           p
13900 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  Tab->aCol[i].zTy
13910 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe ? pTab->aCol[
13920 69 5d 2e 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65  i].zType : "nume
13930 72 69 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ric", P3_STATIC)
13940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13950 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13960 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61  Integer, pTab->a
13970 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20  Col[i].notNull, 
13980 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
13990 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
139a0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
139b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
139c0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
139d0 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  1, pTab->aCol[i]
139e0 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49  .zDflt, P3_STATI
139f0 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
13a00 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13a10 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30  P_Callback, 5, 0
13a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13a30 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
13a40 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
13a50 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f  eft, "index_info
13a60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  ")==0 ){.    Ind
13a70 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
13a80 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
13a90 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
13aa0 49 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74  Index(db, zRight
13ab0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
13ac0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  dx ){.      stat
13ad0 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49  ic VdbeOp tableI
13ae0 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b  nfoPreface[] = {
13af0 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
13b00 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
13b10 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c         "seqno"},
13b20 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
13b30 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
13b40 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20         "cid"},. 
13b50 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
13b60 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20  mnName,  2, 0,  
13b70 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20       "name"},.  
13b80 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74      };.      int
13b90 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   i;.      pTab =
13ba0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
13bb0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
13bc0 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
13bd0 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50  ySize(tableInfoP
13be0 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e  reface), tableIn
13bf0 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20  foPreface);.    
13c00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
13c10 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
13c20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e  {.        int cn
13c30 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  um = pIdx->aiCol
13c40 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
13c50 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13c60 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
13c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13c80 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13c90 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75   OP_Integer, cnu
13ca0 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
13cb0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13cc0 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
13cd0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
13ce0 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63  rt( pTab->nCol>c
13cf0 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  num );.        s
13d00 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
13d10 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61  3(v, -1, pTab->a
13d20 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c  Col[cnum].zName,
13d30 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
13d40 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
13d50 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
13d60 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20  ack, 3, 0);.    
13d70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
13d80 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
13d90 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69  trICmp(zLeft, "i
13da0 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29  ndex_list")==0 )
13db0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
13dc0 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
13dd0 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  ab;.    pTab = s
13de0 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
13df0 62 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20  b, zRight, 0);. 
13e00 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
13e10 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47       v = sqliteG
13e20 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13e30 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 54 61        pIdx = pTa
13e40 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  b->pIndex;.    }
13e50 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26  .    if( pTab &&
13e60 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69   pIdx ){.      i
13e70 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
13e80 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69   static VdbeOp i
13e90 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b  ndexListPreface[
13ea0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
13eb0 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
13ec0 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65 71  0, 0,       "seq
13ed0 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
13ee0 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c  _ColumnName,  1,
13ef0 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22   0,       "name"
13f00 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
13f10 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20  ColumnName,  2, 
13f20 30 2c 20 20 20 20 20 20 20 22 75 6e 69 71 75 65  0,       "unique
13f30 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a 20 20  "},.      };..  
13f40 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13f50 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
13f60 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74 50 72  Size(indexListPr
13f70 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c 69 73  eface), indexLis
13f80 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20  tPreface);.     
13f90 20 77 68 69 6c 65 28 70 49 64 78 29 7b 0a 20 20   while(pIdx){.  
13fa0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
13fb0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
13fc0 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
13fd0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13fe0 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
13ff0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
14000 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
14010 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d  eP3(v, -1, pIdx-
14020 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
14030 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
14040 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
14050 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
14060 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
14070 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
14080 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
14090 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33  , OP_Callback, 3
140a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 2b 2b  , 0);.        ++
140b0 69 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  i;.        pIdx 
140c0 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pIdx->pNext;. 
140d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
140e0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44  else..#ifndef ND
140f0 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
14100 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
14110 22 70 61 72 73 65 72 5f 74 72 61 63 65 22 29 3d  "parser_trace")=
14120 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
14130 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61 72 73   void sqlitePars
14140 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20 63  erTrace(FILE*, c
14150 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66 28 20  har *);.    if( 
14160 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
14170 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
14180 74 65 50 61 72 73 65 72 54 72 61 63 65 28 73 74  teParserTrace(st
14190 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22  dout, "parser: "
141a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
141b0 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72      sqliteParser
141c0 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20  Trace(0, 0);.   
141d0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
141e0 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  f..  if( sqliteS
141f0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69  trICmp(zLeft, "i
14200 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 29  ntegrity_check")
14210 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
14220 63 20 56 64 62 65 4f 70 20 63 68 65 63 6b 44 62  c VdbeOp checkDb
14230 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
14240 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30  P_SetInsert,   0
14250 2c 20 30 2c 20 20 20 20 20 20 20 20 22 32 22 7d  , 0,        "2"}
14260 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
14270 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20  eger,     0, 0, 
14280 20 20 20 20 20 20 20 30 7d 2c 20 20 20 0a 20 20         0},   .  
14290 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 52 65 61      { OP_OpenRea
142a0 64 2c 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  d,    0, 2,     
142b0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
142c0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30  P_Rewind,      0
142d0 2c 20 37 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 7,        0},.
142e0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
142f0 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20  n,      0, 3,   
14300 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 34       0},    /* 4
14310 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
14320 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30  etInsert,   0, 0
14330 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
14340 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
14350 20 20 20 20 20 30 2c 20 34 2c 20 20 20 20 20 20       0, 4,      
14360 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
14370 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30 2c  _IntegrityCk, 0,
14380 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
14390 20 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 20 20    /* 7 */.      
143a0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
143b0 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
143c0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
143d0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
143e0 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
143f0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
14400 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74    { OP_SetInsert
14410 2c 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  ,   1, 0,       
14420 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f   "2"},.      { O
14430 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 31  P_Integer,     1
14440 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
14450 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 52        { OP_OpenR
14460 65 61 64 2c 20 20 20 20 31 2c 20 32 2c 20 20 20  ead,    1, 2,   
14470 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
14480 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
14490 20 31 2c 20 31 37 2c 20 20 20 20 20 20 20 30 7d   1, 17,       0}
144a0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
144b0 75 6d 6e 2c 20 20 20 20 20 20 31 2c 20 33 2c 20  umn,      1, 3, 
144c0 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
144d0 20 31 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f   14 */.      { O
144e0 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31  P_SetInsert,   1
144f0 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
14500 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
14510 20 20 20 20 20 20 20 20 31 2c 20 31 34 2c 20 20          1, 14,  
14520 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
14530 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c   OP_IntegrityCk,
14540 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
14550 2c 20 20 20 20 2f 2a 20 31 37 20 2a 2f 0a 20 20  ,    /* 17 */.  
14560 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
14570 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
14580 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
14590 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
145a0 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
145b0 7a 65 28 63 68 65 63 6b 44 62 29 2c 20 63 68 65  ze(checkDb), che
145c0 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  ckDb);.  }else..
145d0 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72 65    {}.  sqliteFre
145e0 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  e(zLeft);.  sqli
145f0 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a  teFree(zRight);.
14600 7d 0a                                            }.